一、Apache Kafka 简介
Apache Kafka 是一个开源事件流平台,支持数据管道和流分析等工作负载。云函数 SCF 支持将业务函数与自建的 Apache Kafka 集群结合使用,支持的 Kafka 集群包括跨地域的 CKafka 集群、其他云厂商上的 Kafka 集群或通过 Confluent Cloud 等程序管理的类 Kafka 集群(如 Azure 的 EventHub)。
云函数 SCF 支持基于 Kafka 协议框架的事件源,支持批量消费,并可通过最大批量消息数、最长等待时间、重试次数等参数控制批处理行为。
二、自建 Apache Kafka 触发器特点
自建 Apache Kafka 触发器具有以下特点:
·Pull 模型:云函数的后台模块作为消费者,连接 Kafka 实例并消费消息。在后台模块获取到消息后,会将消息封装到数据结构中并调用指定的函数,将消息数据传递给云函数。
·同步调用:自建 Apache Kafka 触发器使用同步调用类型来调用函数。有关调用类型的更多信息,请参见 调用类型。
注意:说明:
三、自建 Apache Kafka 触发器属性
·触发器名称:支持2~60个字符,支持 a-z,A-Z,0-9,-和_。必须以字母开头,以数字或字母结尾,且一个函数下不支持同名的多个定时触发器。
·Bootstrap Servers:配置需连接消费的自建 Apache Kafka 实例地址,支持多个 Bootstrap Servers,支持IP+端口 或 域名+端口。
·Topic:输入已创建的 Apache Kafka 实例的Topic。
·Consumer Group:选择已创建的 Apache Kafka 实例的 Consumer Group。如果指定的消费组不存在,函数将自动创建新消费组。推荐使用独立消费组,不和已有的业务混用,以免影响已有的消费收发。
·安全协议:Apache Kafka 实例所使用的安全协议,当前支持PLAINTEXT、SASL_SSL、SASL_PLAINTEXT。
·身份验证机制:Apache Kafka 实例所使用的身份验证机制,当前支持无、PLAIN、SCRAM-SHA-256、SCRAM-SHA-256,若你的实例未设置身份验证,可选择无。
·用户名及密码:选择了身份验证机制的情况下,需输入允许访问该实例的用户名及密码。
·最大批量消息数:拉取并批量投递给云函数时的最大消息数,目前支持最高配置为10000。结合消息大小、写入速度等因素影响,每次触发云函数并投递的消息数量不一定能达到最大值,而是处在1 – 最大消息数之间的一个变动值。
·起始位置:触发器消费消息的起始位置,当前支持从最新位置开始消费。
·重试次数:函数发生运行错误(含用户代码错误和 Runtime 错误)时的最大重试次数。
·最长等待时间:单次触发的最长等待时间。示例:用户配置了最大批量消息数为1000,最长等待时间为60秒。假设10秒后,云函数已经采集了1000条消息,则直接触发函数执行;假设过了60秒,云函数只采集到50条消息,也会触发函数执行。
四、自建 Apache Kafka 消费及消息传递
由于自建 Apache Kafka 消息无主动推送能力,需要消费方通过拉取方式进行消费。因此,在配置自建 Apache Kafka 触发器后,云函数后台会通过启动自建 Apache Kafka 消费模块,作为消费者,并在自建 Apache Kafka 中创立独立的消费组进行消费。
云函数后台的消费模块在消费到消息后,会根据一定的超时时间、累积消息数量大小及最大批量消息数等信息,组合为事件结构并发起函数调用(同步调用)。相关限制说明如下:
·超时时间:目前云函数后台的消费模块的超时时间为60秒,避免时延过长才进行消费。例如,Topic 的消息写入很少,消费模块在60秒内没有凑够最大批量消息数的消息,则依然会发起函数调用。
·同步调用的事件大小限制:6MB,详情请参见 限制说明。如果 Topic 的消息很大,例如单条消息就已经达到6MB,由于同步调用的6MB限制,传递给云函数的事件结构中只会有一条消息,而不是用户配置的最大消息个数。
·最大批量消息数:同自建 Apache Kafka 触发器属性,由用户设置,目前支持最高配置为10000。
·消费机制:函数平台支持 at least once(至少消费1次),不保证 exactly once(即不能保证数据完全不重复消费)。
云函数后台的消费模块会循环这个过程,且会保证消息消费的顺序性,即前一批消息消费完(同步调用),再进行下一批消息的消费。
注意:说明:
五、自建 Apache Kafka 消息堆积了很多该如何处理?
在你配置自建 Apache Kafka 触发器后,云函数后台会通过启动消费模块作为消费者,在自建 Apache Kafka 中创立独立的消费组进行消费,且消费模块的数量等于 Topic 的分区(partition)数量。如果堆积了很多消息,则需要提升消费能力。提升消费能力的方法如下:
优化云函数的运行时间。云函数的运行时间越短,消费能力就越强。若云函数的运行时间变长(例如,云函数内需要写 DB,DB 的响应变慢),则消费速度就会下降。