无服务器架构介绍
在云上构建系统可以有另外一种选择:无服务器架构。它是BAAS(Backends-as-a-Service)的基础,易扩展,能很方便的处理数据库、消息、用户管理等。其包括常见的FAAS(Functions-as-a-Service)——能够定制小的、事件触发、函数式功能,并部署在一个完全受管理的平台,FAAS托管了所有的部署、资源分配、扩展、维护以及监控工作。
设计无服务器系统意味着对基础设施的节省,因为它屏蔽了有关底层的设施建设、错误处理、低级的操作,并且显著的缩短了产品或特性的上市周期。
有三类应用可以很好的利用无服务器的优势:
- 移动端、单页面web或B2B产品的后台同步响应的API接口。无服务架构可以加速其上市周期;
- 多种操作或API集成的逻辑“胶水”组合。无服务架构可以发挥超级好的作用,因为其最适合小片段逻辑的书写。
- 异步消息和文件处理。无服务架构可以自动伸缩负载。
这篇文章会介绍第3中情况。
一个异步处理的例子
“异步消息和文件处理”并不是严谨的描述,其实这个概念很泛,因此这里描述的应用或组件,应该会有下列特性:
- 被一个消息触发,文件或其他类型的对象被传递在他们的上下文中;
- 执行一些输入事件的处理;
- 输出到数据仓储、消息组件、api终结点上,而不是同步返回到事件源;
- 可以使用本地状态并且为了完成处理从外部组件拉取数据。
在AWS云上,AWS Lambda的应用之一是图片文件处理。如果你有一个移动App或单页面WebApp,并且需要处理上传的照片,这样使用时非常棒的!就如同下面的流程一样。
对比以上提出的特性,图片文件处理应用:
- 被AWS S3原始文件的建立触发
- 用图片封装类库处理新版本
- 输出图片的不同版本到 S3
- 无状态,不需要任何外部组件。
更复杂的例子是数据管道。一个数据管道是链接到异步服务的生态系统,执行数据的处理,ETL处理,导入到分析系统或其他。这些系统在持续处理大数据上是特别流行的,并提供给移动app查看的功能。
无服务器数据管道是FAAS平台的应用之一,例如AWS Lambda,为了计算的需要,总是用一批宿主到无服务器BAAS的服务处理数据存储和传输,就像下图所示。
注意,上图简化了实际的产品应用场景,例如一般使用Kinesis Firehouse加载数据到RedShift。
对照上述定义:
- 在消息总线上触发事件,例如:AWS Kinesis Streams 或SNS 或 AWS S3的文件或对象的建立,或者AWS的DynamoDB表数据的更新;
- 经典询问或传输事件,或者拆分子事件,或组合事件
- 可以在不同总线上建立新消息,写S3的新文件,更新统计数据库,和其他HTTP服务通信
- 请求远程服务获取需要处理的事件数据,这些服务可以使无服务,例如:DynamoDB或Lambda Http服务,也可以是传统服务,例如Redis,Sql数据库等。组件可以跨越多个消息缓存本地状态,但不能使用自己的本地内存或硬盘数据,因为FAAS的生命周期很短暂。
理解AWS生态的无服务器组件
在上述例子中使用到了云上的无服务器组件,其提供商是 Amazon,当然其他的云服务商也有类似的组件。
简述AWS组件功能如下:
- Lambda:AWS的FAAS平台,其提供了大量的易扩展的,轻量级编程模型,运行语言可选:Javascript,Python,Java/JVM 和c#
- S3:AWS的最老的一个服务,其是对象存储组件,其提供高扩展、高可用并且精确合理的费用,S3的事件可以轻易结合Lambda服务。
- Kinesis Stream:AWS的高吞吐、持久、耐用的排序日志组件,对标Apache的Kafaka。Lambda集成它,执行消息处理。
- SNS:短信组件;
- DynamoDB:AWS的高性能NoSql数据服务。它可以作为无服务数据处理的事件源触发。
混合非无服务器架构服务
非无服务器组件或服务也可以是无服务器架构的一部分,这才是一个完美的世界。例如,Sql数据库需要在Lambda服务内用到,但其并不是无服务的架构,它仍然可能是AWS RDS的一部分。
混用需要留心的是两者的可扩展性不同,你需要使用不同的方式进行扩展。
使用Java实现数据处理
我们已经提到在AWS的生态中,Lambda可以写FAAS代码,并且Java是其中被支持的一种语言之一。
Java在Lambda世界里有个不太好的名声,因为其相对Javascript和Python有比较高的冷启动消耗。
冷启动是发生在AWS为你的函数建立一个新容器时,它一般发生在你部署了一个新版本的服务并且第一次运行时。某些场景下,冷启动Java需要几秒时间。然而,在数据处理场景下,java经常被选用:
![](/qrcode.jpg)
- 通过一些相当简单的调整,冷启动影响通常可以减少到几百毫秒。对于许多异步事件处理系统,这是完全合理的。此外,对于连续处理事件的系统,只有很小一部分可能会受到冷启动。我们的意思是微小,可能只有0.001%。
- 处理相当连续的事件流时,Java通常可以以比Javascript和Python更低的延迟执行。这不仅有利于应用程序性能,而且对于运行时间超过100毫秒的中等复杂的lambda函数,您可以看到使用Java作为您的环境可以节省成本,因为Lambda的计费方式非常精确。
- 由于已经在Java中实现了大量现有的非无服务器数据处理应用程序,因此您可以通过将Java域逻辑从旧应用程序移植到新的Lambda组件来看到重用代码的机会。
结论
无服务器架构在基础架构成本,人工和上市时间方面提供了显着的优势。在本文中,我们展示了无服务器架构如何用于构建各种类型和复杂性的无服务器数据处理应用程序。
无服务器仍然是构建系统的一种新方式 - 当您使用这些创意时,您将无法使用惯例指导您的每一步。在接下来的几年中,使用这些技术的最佳方式将变得更加清晰。但对于那些愿意屡起袖子的人来说,从这个令人兴奋的行业发展中获得的好处已经有很多了。
在此我向大家推荐一个微服务架构学习交流群。QQ交流学习群号:864759589 里面会分享一些资深架构师录制的视频录像:高并发、高性能、分布式、微服务架构的原理,分布式架构等这些成为架构师必备的知识体系。