云函数 SCF 现已支持将 Apache Kafka 作为事件触发源,实现 Kafka 消息的批量消费和处理。
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 触发器使用同步调用类型来调用函数。有关调用类型的更多信息,请参见 调用类型。 说明:
对于运行错误(含用户代码错误和 Runtime 错误),自建 Apache Kafka 触发器会按照您配置的重试次数进行重试。默认重试10000次。
对于系统错误,自建 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 消费模块,作为消费者,并在自建 Apache Kafka 中创立独立的消费组进行消费。
云函数后台的消费模块在消费到消息后,会根据一定的超时时间、累积消息数量大小及最大批量消息数等信息,组合为事件结构并发起函数调用(同步调用)。相关限制说明如下:
超时时间:目前云函数后台的消费模块的超时时间为60秒,避免时延过长才进行消费。例如,Topic 的消息写入很少,消费模块在60秒内没有凑够最大批量消息数的消息,则依然会发起函数调用。
同步调用的事件大小限制:6MB,详情请参见 限制说明。如果 Topic 的消息很大,例如单条消息就已经达到6MB,由于同步调用的6MB限制,传递给云函数的事件结构中只会有一条消息,而不是用户配置的最大消息个数。 最大批量消息数:同自建 Apache Kafka 触发器属性,由用户设置,目前支持最高配置为10000。
云函数后台的消费模块会循环这个过程,且会保证消息消费的顺序性,即前一批消息消费完(同步调用),再进行下一批消息的消费。
说明:
在这个过程中,每次组合的消息数量不一定相同,即每个事件结构内的消息个数在1 - 配置的最大消息个数之间。如果配置的最大消息数过大,有可能出现事件结构内的消息个数始终不会达到最大消息数的情况。
在云函数中获取到事件内容后,可选择循环处理的方式,确保每一条消息都得到处理,而不应假定每次传递的消息个数均是恒定的。
云函数会使用标准 Kafka 协议获取您所指定的 Topic 下的分区数,同时后台消费模块自动创建相同数量的消费者,若未获取到对应的分区数,将默认创建20个消费者。
常见问题
自建 Apache Kafka 消息堆积了很多该如何处理?
在您配置自建 Apache Kafka 触发器后,云函数后台会通过启动消费模块作为消费者,在自建 Apache Kafka 中创立独立的消费组进行消费,且消费模块的数量等于 Topic 的分区(partition)数量。如果堆积了很多消息,则需要提升消费能力。提升消费能力的方法如下:
优化云函数的运行时间。云函数的运行时间越短,消费能力就越强。若云函数的运行时间变长(例如,云函数内需要写 DB,DB 的响应变慢),则消费速度就会下降。
本页内容是否解决了您的问题?