- 文档首页
消息队列 Kafka版
最佳实践
Kafka CPU 消耗场景分析
Kafka CPU 消耗场景分析
本文档主要介绍 Kafka 使用过程中可能产生 CPU 大量消耗的场景,并针对各个场景提供客户端使用策略相关的优化建议。
基于产品定位与产品设计,Kafka 并非计算密集型产品,Kafka 实例的业务数据量主要体现在网络带宽占用与磁盘的吞吐,日常场景下无需关注 CPU 占用率。但是在实际生产环境中,往往存在多样化的使用场景,部分业务模型中 CPU 也会成为服务端的使用瓶颈。
目前对于服务端 CPU 消耗比较大的主要场景有请求速率过快、客户端消息格式低于服务端版本。
Kafka 在客户端的设计实现中就已经考虑到请求速率过快的问题。
- 对于消息发送,Kafka客户端的设计本身并不是同步消息发送的,业务在调用发送接口后,消息并不会直接发送到服务端,而是缓存在客户端内存中,发送的消息会在缓存中做消息聚合。之后由客户端后台会维护的一个异步发送线程来不断从内存缓存中读取数据,然后再将数据发送到服务端。
说明
因为 Kafka 是异步发送的方式,建议关注发送结果的回调函数。
- 而对于消息消费,Kafka客户端使用了拉(pull)模式来实现,由客户端主动发起消息读取的请求。每次消息读取也是批量读取,之后将读取的结果缓存在本地内存中,之后业务调用接口从再缓存中读取数据。
发送和消费都已经使用了批量聚合方式,但是部分场景下也会存在过快的请求速率。原因在于 Kafka 本身默认的配置都为尽速处理,发送端尽可能快地发送,消费端尽可能快地消费。因而在用户业务量相对较大的场景下,默认的配置无法满足具体的业务请求。
通常造成请求过多的原因主要包括以下几种:
截止当前,Kafka 历史版本演进存在过两次消息格式的版本迭代,第一次为 0.10 版本,第二次为 0.11 版本。当前火山支持的版本,消息格式都为最新的版本,如果客户端支持的消息版本与服务端消息版本不一致,那么在服务端存储之前会转换为服务端本地的消息格式进行存储,而在消费时,又会将消息格式转换成消费者支持的格式。这个过程对于 CPU 的消耗相对更高。
对于这种情况,推荐的方式是更新客户端的版本,保证不会导致在生产与消费的过程中格式不一致从而导致产生消息转换。当前火山 Kafka 都支持 v2 版本的消息格式,推荐使用 2.2 以上版本的客户端。
最近更新时间:2025.06.27 14:15:25