深入理解Kafka-学习笔记03-消息有序性

  Kafka只能保证分区内消息有序,为了保证有序性,在acks配置非零的前提下,需指定max.in.flight.requests.per.connection(每个连接最多缓存的请求数)为1,保证前一个消息发送成功,后一个消息才开始发送;如果acks配置为0,那么生产者发送消息之后不需要等待任何服务端的响应,推送失败消息就丢失了,也不会有乱序的问题。
  那么max.in.flight.requests.per.connection大于1时怎么保证消息有序,需要开启幂等(设置enable.idempotence为true开启)。请注意,启用幂等性需要确保 max.in.flight.requests.per.connection小于或等于5,retries 大于等于0,并且ack必须设置为all。

 

对于为什么官方文档写着启用幂等性需要确保 max.in.flight.requests.per.connection小于或等于5呢?

 

 是由于幂等性相关代码中有个ProducerStateEntry实体,用于存储每个producerId对应的Batch,并且只能固定缓存5个BatchMetadata。若max.in.flight.requests.per.connection设为大于5的话,有可能会造成某一批次的元数据被挤出缓存,如果该批次又发生重试,就会因为永远找不到其对应的BatchMetadata。

 

posted @ 2021-08-31 17:36  梦玄庭  阅读(616)  评论(0编辑  收藏  举报