背景介绍
消息队列服务(下文均以 Message Service 命名)作为云计算 PaaS 领域的基础设施之一,其高并发、削峰填谷的特性愈发受到开发者关注。Message Service 对上承接消息生产者服务的请求,对下连接消费者服务。提到消费:那就不得不引入两个问题?
- 如何以低成本、高吞吐、低延时的方式将消息数据从 Message Service 输送给下游消费服务?
- 如何快速构建免运维、按需弹性伸缩算力的消息消费服务?
今天就来聊聊如何在阿里云上基于 Serverless 计算服务 + Message Service 构建这样一套系统。
名词解释
函数计算(Function Compute)
阿里云函数计算是事件驱动的全托管 Serverless 计算服务。通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传。函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码,更多产品细节可阅读官方文档[1]。
连接器(Connector)
Connector 实现了大量数据的导入和导出。例如将 KAFKA topic 中数据导出到 stdout,或将本地文件中数据导入到 RocketMQ。Connector 简化了数据在不同系统间复制和传输的复杂度,本文探讨的消息服务和计算服务的连接同样依赖 Connector 实现。
事件总线(EventBridge)
事件总线是 Connector 的产品化服务,支持阿里云服务、自定义应用、SaaS 应用等以标准化、中心化的方式接入,并能够以标准化协议在这些应用之间路由事件,帮助您轻松构建松耦合、分布式的事件驱动架构,更多产品细节可阅读官方文档[2]。
架构演进
传统的数据消费架构如下图左:
1)数据源将产生的数据写入到消息系统;
2)开发者借助 Message Service 提供的 OpenAPI/SDK 或 Proxy 服务客户端从 Message Service 读取数据;
3)根据消息数据处理业务逻辑,也就是我们所谓的消费消息,将消息消费的业务结果写入到目标服务;如此架构开发者会面临以下几个问题:
1、如何并发安全的从 Message Service 读取数据?
2、数据消费能力小于生产能力时,如何快速提升消费吞吐?
3、目标服务资源成为瓶颈时,如何快速扩容?当流量波峰过后,面对空闲的机器成本,您又如何处理?
4、如何保证消费实时性、顺序性?
5、如何实现容错、缓存、降级、限流等高可用保护手段?
6、如何监控链路状态或异常?
面对上面多个琐碎又复杂的问题,相信总有几个会击中您的痛点。为了同时解决提到的所有问题,阿里云开发 Connector Service(如上图右)打通 Message Service 和 Serverless 计算服务的数据链路,您只需声明上游的消息服务实例和下游的消费算子,便可一键部署上线,连接器同时提供了丰富的流计算框架具备的数据处理能力和监控能力,总结如下:
Transform:以 UDF 方式自定义数据清洗逻辑,同时支持 JsonPath 语法简单提取数据;
- Filter:减少无用消息的后续处理,提供多种过滤匹配规则,如:前后缀匹配