如何防止消息丢失
生产者:
- ack设置成1
- 如果对消息防丢失要求非常高,可以配置
ack=all
,min.insync.replicas
配置成分区备份数
消费者:
- 使用手动提交,业务处理完成才提交offset
防止消息重复消费
生产者:
- 生产者要避免生产重复消息,因此需要关闭重试
消费者:
- 实现幂等性,万一出现重复消息时,业务上不会重复处理
消息顺序性
生产者:
- 生产消息时要保证顺序,因此需使用同步发送,且关闭重试
- 只能往一个分区里发,多分区之间是不保证顺序的
消费者:
- 只能消费一个分区里的数据,多分区之间不保证顺序
因此为了保证消息顺序性,往往需要牺牲性能,只能一个分区工作,也只能一个消费者工作
消息积压
当消费速度跟不上生产速度导致消息积压时,可以采用以下手段:
- 增加分区,增加消费者
- 把部分消息再往另一个主题上发,再增加消费者,该方法本质上与第一个方法一样,但实操步骤不一样
- 如果是硬件性能瓶颈,可以增加服务器来增加单个消费者的消费能力
如何提高生产者吞吐
有以下几项配置可以优化来提高吞吐量:
配置项 | 描述 |
---|---|
buffer.memory | 缓冲区大小,默认32m,可以调大,例如64m |
batch.size | 缓冲区一批数据量,默认16k,可以调成例如32k |
linger.ms | 如果数据量未达到batch.size,linger.ms时间之后就会发送,默认是0ms,可以调成5-100ms之间 |
compression.type | 压缩方式,默认不压缩,支持gzip, snappy, lz4, zstd |