购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第1章

在云中运行函数

本章导读:

·为什么函数是应用程序的基本单元(primitive)?

·AWS Lambda概述。

·使用函数作为应用程序的后端服务。

·使用函数构建事件驱动的应用程序。

·从客户端调用函数。

近些年来,云计算已经极大地改变了我们思考和实施IT服务的方式,它允许任何规模的企业和组织方便地构建出强大且可扩展的应用程序,进而颠覆其所在的行业。想想Dropbox是如何改变人们存储和分享文件的方式,Spotify又如何改变人们购买和使用音乐的方式,这些成功企业的背后都离不开来自云计算的力量

这两家公司都是从零起步的创业企业,必须把时间和资源集中运用,才能让创意快速付诸实现。软件开发不可避免存在诸如管理和扩展基础设施、给操作系统打补丁、维护软件栈(Software Stack)等繁琐但却不产生真正价值的工作。云计算最重要的价值之一,就是让软件开发者可以聚焦在构建独特和重要功能的开发工作之上。

应用程序可以通过云计算获得虚拟服务器、存储、网络和负载均衡器等基础设施,并且这些基于云计算的基础设施可以根据特定的配置实现按需伸缩。但即使在这样的情况下,软件开发人员仍旧需要为代码准备一个完备的执行环境,通常包括在虚拟机上安装并配置一个操作系统(如某个Linux发行版),选择并配置好程序依赖的基础框架。只有当整个技术栈准备就绪,才算到了部署代码并开始工作的时候。而即使通过类似Docker这样的容器技术满足了快速构建应用程序运行环境的需求,也依然无法避免管理版本和更新容器这类繁重(并且容易出错)的工作。

有时,为了查看和管理底层的资源,软件开发人员必须获得访问基础设施层的权限。不过,人们也可以选择那些把底层资源抽象并封装的云计算服务,这些服务通过平台的方式为软件开发人员直接提供定制化的部署和管理应用程序的能力。举例而言,有些云计算平台为用户提供“开箱即用”的数据库服务能力,人们只需要把数据(和与之关联的数据库结构模式,即Database Schema)导入这些服务即可,而不用亲自安装、管理数据库软件以及底层的各种软硬件环境。另一个典型的例子是类似PaaS平台的云计算服务,软件开发人员只需要向平台提供应用程序的打包代码,平台会通过标准化的基础架构,以自动化的方式去运行和管理这些应用程序。

上述这些例子,对于开发环境而言或许还算容易胜任,但是当我们开始进行生产环境的部署时,事情将变得更加复杂,比如可能需要面对诸如可扩展性、高可用性之类的复杂需求。还有,千万不能忘了安全:在应用软件开发和部署的过程中,始终需要关注用户、权限和资源之间的复杂关系。

随着Amazon发布AWS Lambda服务,云计算的抽象层次被进一步提升了,这项创新的服务允许开发者把一组函数打包发布,然后由AWS平台来负责具体的管理和执行。在这种情况下,人们不再需要主动管理依赖的基础框架和操作系统,也无需处理运行阶段所面临的高可用性和可扩展性问题。每一个函数都有属于自己的安全配置,这些配置可以借助Amazon Web Services(AWS)的标准安全功能,设定函数的执行范围和对资源的访问权限。

这些函数可以直接被客户端调用,也可以依靠订阅其他资源所发出的事件来被触发。如果函数订阅了诸如文件仓储或数据库所发出的事件,那么当这些资源的内容发生变化触发了事件后,函数就会根据订阅的类型,被AWS Lambda平台自动执行。举个例子:当文件被上传到云存储,或者数据库的字段被修改,我们可以设定一个会自动在这些变化发生时执行的AWS Lambda函数,来对新的文件或修改后的数据做一些操作。在原始图片保存到云存储后,AWS Lambda函数可以用来执行缩略图的创建;当生产环境中数据库的字段发生更新后,AWS Lambda函数还可以自动把这些新的数据同步到数据仓库。基于这样的技术,软件开发人员可以把应用程序设计为通过事件来驱动的新式架构。

不论函数是被诸如智能手机之类的客户端直接调用,还是通过订阅事件的方式触发,我们都可以把负责完成不同功能的函数集中在一起,构成一个完整的事件驱动应用程序。如图1-1所示,这是一个媒体分享应用程序(采用事件驱动架构)的逻辑流程图:它完成了用户上传图片、后台处理和分享等基本功能。

本书插图规范

本书使用以下插图规范以便于更清晰表达信息。

图1-1 使用多个AWS Lambda函数构建的一个基于事件驱动的媒体分享应用程序,这个架构包括了一组由移动端直接调用和由存储仓库(repository)之上发生的事件(如文件写入或数据库更新)所驱动的AWS Lambda函数

注意 如果你现在还不能完全理解图1-1中所表达的架构和流程,请不用担心。通过阅读本书,你会很快掌握设计事件驱动应用程序的架构原则,并在此基础上自己动手完成一个使用了AWS Lambda函数并包含用户身份验证能力的媒体文件分享应用程序。

而在使用那些并非与AWS Lambda原生集成的第三方软件或服务时,我们依然可以轻松地把它们集成到使用AWS Lambda函数的应用中,这类集成工作可以通过支持多种编程语言的AWS软件开发工具包(AWS SDK)来完成。

事件驱动的方式不仅简化了应用程序的开发工作,也简化了设计可扩展性应用逻辑的工作。举例而言,假设我们有一个响应文件上传事件的AWS Lambda函数,每当有新文件被上传到云存储,这个函数便会获取对应的文件信息并把这些信息写入数据库。我们可以把这个函数设想为文件存储和数据库之间的一个逻辑连接:今后不论应用的任何组件处理了文件上传的操作,这个函数都可以立即被调用并更新数据库的内容。

当我们给应用增加新功能后,应用的逻辑变得臃肿和难以管理。但是在上述的情况下,文件上传与数据库之间的连接是相对独立的一个逻辑。本书后面的章节会介绍处理的方法,并提供相应的练习。

不论是创业团队还是大型的企业公司,函数都能把应用程序简化为构建单元(building block)的形式,极大地提高开发者的工作效率,显著缩短业务功能的交付周期。 ch2qXr8ud2DG6S2Ot1r4jl5gOCaweRbD0kQR0fZY4GYlGiLre+QnOqWCH1E0Fah3

点击中间区域
呼出菜单
上一章
目录
下一章
×