
4.4 Serverless和消息队列
在Serverless架构中,涉及消息处理、异步解耦的场景时,消息队列的打通就变得尤为重要了。本节将介绍消息队列Kafka的基本概念和特性,并举例说明消息队列和Serverless关联的场景。
4.4.1 基本概念
Apache Kafka是一个分布式的流数据平台,既可以作为消息引擎,用来对流数据进行发布和订阅,也可以作为消息的流失存储,确保存储的容错性,还可以作为一个流处理的平台提供服务,对流数据进行处理。Apache Kafka的架构及特性如图4-16所示。

图4-16 消息队列Apache Kafka架构
由于Apache Kafka是一个开源项目,搭建方式简单便捷,并且具备高性能的特点,因此许多企业会选择自建Kafka集群。但是随着业务消息量增加,自建集群会出现各种各样的问题,需要开发人员持续运维,针对参数配置进行调优,保证维持高性能运行,并且快速处理突发故障,对集群的健康状况进行监控和扩缩容,在进阶使用Kafka服务及周边组件的过程中也有一定的门槛。因此,市面上也出现了商业化公司如Confluent,提供消息队列Kafka的托管服务。公有云厂商也提供了Cloud Kafka的云端解决方案,通过增加下列特性,保证Kafka服务的托管、伸缩和免运维。
- 高可用:提供磁盘高可靠,即使服务器坏盘达到50%,也不会影响业务,保证数据不丢失。
- 高可靠:提供多副本备份,支持跨可用区容灾。
- 水平扩展:解决开源版本Kafka长期以来数据水平扩展和迁移的痛点,配置升级无感知。
- 鉴权和安全性:支持云上私有网络隔离、账户权限管理以及SASL等鉴权方式,保证公网访问的安全性。
- 数据监控告警:针对集群提供默认的指标监控和告警配置(例如消息条数、磁盘容量、峰值带宽等),及早发现异常问题。
- 云上服务打通:支持和公有云上的对象存储、MapReduce等服务一键打通。
- 开源兼容:完全兼容Kafka 0.9、0.10和1.1.1等社区版本。
消息队列Kafka在日志转储、大数据分析等场景下均有典型的应用。如图4-17所示,某知名电商在做视频直播的过程中,利用CDN做数据分发,产生许多日志数据。业务方需要利用日志数据进行实时数据分析,因此客户选择将流式数据上传到Kafka中,并由业务团队实时拉取进行消费,从而实现了分钟级别的数据分析能力。

图4-17 消息队列Kafka在日志转储场景的应用
消息队列在大数据分析方面也有非常广泛的应用。如图4-18所示,某知名UGC视频企业通过自建Kafka和ELK的方案进行数据处理、过滤,但随着数据量增大,自建运维成本越来越高。因此该企业选择结合公有云的大数据套件+消息队列CKafka的方案,划分数据清洗和计算、数据检索、数据罗盘等阶段,对数据流转过程进行优化,并且针对业务波峰波谷,支持平滑扩缩容。

图4-18 消息队列Kafka在大数据分析场景的应用
4.4.2 消息队列和FaaS的联动
接下来我们继续了解消息队列和Serverless结合的场景及优势。如图4-19所示,在一个较为通用的流数据处理模型中,上游有多种多样的数据源,如数据库、应用运行过程中采集的日志、第三方数据源等。通过采集工具将这些数据导入消息队列Kafka中,之后再通过各种流处理工具对这些数据进行加工,最终对加工后的数据进行存储落盘或中转处理。

图4-19 流式计算典型数据流示意图
在这个过程中,FaaS可以在数据采集和数据处理环节提供快速、简单、水平扩展的处理能力,从而确保数据处理流的完整性。FaaS本身具备以下几个特点,能够很好地支持消息队列上下游的处理能力。
- 使用成本低(提供多语言的支持,包括自定义运行时)。
- 近乎无限的横向扩容能力。
- 支持多种触发方式,如事件触发、定时触发、API接口调用触发等。
- 按需付费,空闲时不付费。
在没有FaaS参与上述架构的情况下,一般流处理工具和采集工具需要客户自建和运维。例如最典型的ELK集群,消息队列转到Elasticsearch(ES)组件的过程中,需要用户创建ES和Logstash资源,并了解对应的导入配置。而结合FaaS和消息队列触发器的方案时,只需要用户选择对应的模板,即可默认打通消息队列到后端的对象存储/ES等集群,降低了学习门槛,且无须对函数集群进行运维,可以满足业务波峰波谷的需求。使用FaaS后流式计算的典型数据流示意如图4-20所示。

图4-20 FaaS结合流式计算典型数据流示意图
最终架构如图4-21所示,消息队列Kafka结合FaaS函数的多种配置模板,可以实现一键转储流数据到多个数据消费者,例如云上Elasticsearch、对象存储COS、数据库TencentDB、数据仓库Data Warehouse等。可以说,Serverless结合消息队列,实现了更为通用的流数据处理方案,搭建了“云上数据管道”。

图4-21 消息队列联动Serverless搭建“云上数据管道”