Kafka 客户端配置调优
资源分配管理
建议 1: 合理设置 Topic 分区数,避免吞吐瓶颈以及浪费
Kafka Topic 分区数影响了 Topic 能够支持的生产和消费吞吐,在保证顺序的前提下,相同分区 Key 的消息发送到同一个分区,并且 Kafka 每个分区只能被一个消费者处理。
AutoMQ 基于对象存储构建,相比于 Apache Kafka 本地文件的架构,相同的集群规模下可以支持数十倍的分区性能。同时 AutoMQ 对分区不收费。
使用 AutoMQ 分配分区时,无需为成本考虑,只需要按照业务预估的分区吞吐性能评估合适的分区数(AutoMQ 单个分区写入吞吐上限为 4MB/s ),避免后期业务上量再扩展分区。分区数也无需和节点数量的倍数关联,AutoMQ 会自动实现分区的均衡。
举例:
某应用预估未来 1年内 Topic 数据写入吞吐大概是 100MB/s,同时下游消费者单个消费者每秒最多只能处理 2MB 的数据。
则分配分区时需要考虑:
基于生产者视角,需要 100MB/s ÷ 4MB/s = 25 个分区。
基于消费者视角,需要 100MB/s ÷ 2MB/s = 50 个消费者,50 个消费者至少需要 50 个分区。
因此,需要分配至少 50 个分区才可以满足应用的需求。
建议 2: 平台类应用场景,建议开启 ACL,实现上下游访问强管控,便于后期梳理链路拓扑
平台类场景,例如实时计算平台,使用 Kafka 时建议开启 ACL 实现资源细粒度管控。开启资源管控后Kafka 客户 端必须进行身份校验才能访问特定的 Topic、Group。这样做有如下好处:
-
避免业务方随意创建新的 Topic 等资源,造成资源滥用,无法治理。
-
可以规避不同业务方混用 Consumer Group 造成订阅混乱,影响消费负载均衡。
-
根据 Topic、Consumer Group 就可以找出相关的订阅方和上下游业务组,方便进行业务治理。
生产者应用
建议 1:客户端小于 2.1 版本 Kafka Producer 建议设置重试次数
生产者应用需要检查 SDK 版本,如果当前版本小于 2.1,则需要手工设置重试次数,确保消息发送失败时可以自动重试,避免因服务端运维、自动分区迁移等场景造成失败。
重试参数设置可以参考如下信息:
//最大重试次数
retries=Integer.MAX_VALUE
//初始退避延迟时间。
retry.backoff.ms=100
//最大退避延迟时间。
retry.backoff.max.ms=1000
//每次发送请求的 RPC 超时时间
request.timeout.ms =30000
//整个发送调用整体超时时间,超过这个时间后即不再重试,返回调用侧失败异常。
delivery.timeout.ms=120000
建议 2: 优化 Producer 攒批参数,避免碎请求消耗过多 QPS
Kafka 是面向高吞吐场景设计的流存储系统,Kafka 最典型的使用场景是通过批处理提升数据收发过程的效率和吞吐。在 Producer 发送消息过程中需要合理设置攒批参数,避免出现以下情况:
-
避免每次请求只发送一条消息: 生产者每次只发送一条消息会造成大量的 Produce 请求,消耗服务端 CPU,造成集群性能下降。
-
避免设置过长的攒批等待时间: 生产者在设置批量参数时需要设置合理的等待时长,避免因小流量场景下一直无法攒批完成,造成发送消息延迟。
具体设置攒批的参数参考下方:
//批量大小,一次性最多积累128KB 的数据。
batch.size=131072
//攒批时间,对于生产者,如果在指定的时间内没有达到攒批的上限,也会触发发送,这个时间代表了发送的最大延迟。
linger.ms=10
建议 3:设置 ack=all,确保消息持久化成功后再响应
生产者可以通过调整 ack 参数来在数据持久化和发送延迟之间均衡:
-
ack=all(默认值):服务端会在数据持久化到云存储后再响应给客户端。服务端宕机时,已响应成功的消息不会丢失。
-
ack=1:AutoMQ 服务端和 Apache Kafka 保持一致,消息被接收到内存中后就立刻响应给客户端。服务端宕机时,未持久化的消息会丢失。
建议生产者维持默认配置 ack=all 保障数据的可靠性。
AutoMQ 基于对象存储实现消息的持久性和可靠保存,服务端不会产生 ISR 副本复制。设置 ACK=ALL 的处理流量相当于写一份数据(同步持久化)。
消费者应用
建议 1: 注意 Assign 模式消费者,建议升级到 3.2 及以上版本,确保消费位点提交成功率
Kafka Consumer 应用在消费消息时,如果使用了 Assign 模式,即自行分配分区负载均衡的模式,需要确保 SDK 版本升级到 3.2 及以上版本。因为早期版本在 Assign 模式下会存提交消费位点的缺陷,导致消费者位点无法及时提交和更新。详细的缺陷记录参考 Kafka Issue-12563。