常见问题与性能优化


如何防止消息丢失

生产者:

  • ack设置成1
  • 如果对消息防丢失要求非常高,可以配置ack=allmin.insync.replicas配置成分区备份数

消费者:

  • 使用手动提交,业务处理完成才提交offset

防止消息重复消费

生产者:

  • 生产者要避免生产重复消息,因此需要关闭重试

消费者:

  • 实现幂等性,万一出现重复消息时,业务上不会重复处理

消息顺序性

生产者:

  • 生产消息时要保证顺序,因此需使用同步发送,且关闭重试
  • 只能往一个分区里发,多分区之间是不保证顺序的

消费者:

  • 只能消费一个分区里的数据,多分区之间不保证顺序

因此为了保证消息顺序性,往往需要牺牲性能,只能一个分区工作,也只能一个消费者工作

消息积压

当消费速度跟不上生产速度导致消息积压时,可以采用以下手段:

  1. 增加分区,增加消费者
  2. 把部分消息再往另一个主题上发,再增加消费者,该方法本质上与第一个方法一样,但实操步骤不一样
  3. 如果是硬件性能瓶颈,可以增加服务器来增加单个消费者的消费能力

如何提高生产者吞吐

有以下几项配置可以优化来提高吞吐量:

配置项 描述
buffer.memory 缓冲区大小,默认32m,可以调大,例如64m
batch.size 缓冲区一批数据量,默认16k,可以调成例如32k
linger.ms 如果数据量未达到batch.size,linger.ms时间之后就会发送,默认是0ms,可以调成5-100ms之间
compression.type 压缩方式,默认不压缩,支持gzip, snappy, lz4, zstd
文章作者: 周君
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 周君 !
评论