Kafka生产者性能优化配置指南
批量发送是提升生产者吞吐量的关键手段,通过合并多条消息为单个批次减少网络请求次数。
batch.size,也会在linger.ms后发送。适当增大该值(如5~50ms)可提高批次填充率,但会增加单条消息的延迟。需根据业务对延迟的敏感度权衡。消息压缩可显著降低网络传输量和存储成本,适合高带宽或大消息场景。
none(默认,不压缩)、gzip(高压缩率但CPU开销大)、snappy(平衡压缩率与CPU)、lz4(低延迟压缩)、zstd(高压缩率且低延迟,Kafka 2.1+支持)。建议优先选择lz4或zstd,在压缩率与CPU消耗间取得平衡。足够的缓冲区可防止生产者因内存不足而阻塞,保证持续高吞吐。
BufferExhaustedException。建议根据消息吞吐量调整,例如高吞吐场景可设置为64MB~1GB。send()和partitionsFor()方法的阻塞时间(默认60s)。若缓冲区满或元数据未更新,生产者会阻塞直到超时。建议根据业务容忍度调整(如10~30s),避免长时间阻塞导致请求失败。acks参数决定了生产者等待Broker确认的级别,直接影响消息可靠性和吞吐量。
0(不等待确认,最快但可能丢失消息)、1(等待Leader确认,平衡可靠与吞吐)、all(等待所有ISR副本确认,最可靠但吞吐最低)。建议多数场景选择1,对可靠性要求极高的场景(如金融交易)选择all。重试可解决网络抖动、Broker短暂不可用等问题,但需避免无限重试导致延迟。
enable.idempotence=true(Kafka 0.11+支持),会轻微降低吞吐,但能保证消息不重复。producer.initTransactions())。事务可保证消息的原子性(全部成功或全部失败),适合需要严格一致性的场景(如订单处理),但会显著增加延迟。合理的分区策略可提高并行处理能力,避免热点分区(部分分区消息堆积)。
DefaultPartitioner(按消息键的哈希值分配分区)。若消息键分布不均匀(如某些键出现频率极高),可自定义分区器(实现Partitioner接口),例如轮询分配或按业务维度分配,确保分区负载均衡。Kafka依赖磁盘顺序I/O,优先选择SSD(随机读写性能比HDD高10倍以上),或采用RAID 10(兼顾冗余与吞吐)提升磁盘可靠性与性能。
vm.swappiness(默认60)为1~10,减少系统使用交换内存(Swap)的概率,避免因内存不足导致进程被OOM Killer终止。通过JMX或Prometheus+Grafana监控以下核心指标,及时发现问题:
record-send-rate):每秒发送的消息数;batch-size-avg):平均批次大小(应接近batch.size);request-latency-avg):发送请求的平均延迟;record-error-rate):发送失败的消息比例。根据业务负载变化动态调整参数:
batch.size(如从64KB增至1MB)、linger.ms(如从10ms增至50ms),提升吞吐;acks从1改为all,开启enable.idempotence。