卡夫卡订购保证

时间:2017-09-09 06:12:49

标签: apache-kafka kafka-producer-api

我正在查看kafka文档并遇到了

  

担保

     

在高层,Kafka提供以下保证:

     

生产者发送到特定主题分区的消息将是   附在发送顺序中。也就是说,如果发送了记录M1   通过与记录M2相同的生产者,首先发送M1,然后发送M1   将具有比M2更低的偏移量并且在日志中更早出现。一个   消费者实例按照它们存储在的顺序查看记录   登录。对于复制因子为N的主题,我们最多可以容忍N-1   服务器故障而不会丢失任何提交给日志的记录。

我几乎没有问题。

  1. 是否始终保证M1的偏移量低于M2?如果在M1之后重试M2会怎么样?
  2. 我也从各种文件中了解到订单无法保证,消费者必须处理它。

3 个答案:

答案 0 :(得分:4)

即使使用单个分区,可能出现的情况是:

  • 制作人发送M1
  • 制作人发送M2
  • 由于某些失败,
  • M1在第一次尝试时没有被确认
  • M2已发送
  • M1将在随后的尝试中发送。

避免这种情况的一种简单方法是通过生产者配置max.in.flight.requests.per.connection=1

这当然会影响性能,因此应谨慎使用。

答案 1 :(得分:2)

请注意,订购保证适用于分区级别。因此,如果主题中有多个分区,则需要为需要按顺序显示的消息设置相同的分区键。

例如,如果您想从各种传感器收集消息并且传感器具有ID,那么如果您使用此ID作为消息密钥,则消费者将保证从每个传感器订购消息(因为没有传感器会将消息写入超过1个分区)。

回答你的问题:

  1. 是的,M1总是偏移低于M2。偏移量由经纪人设定,因此消息到达经纪人的时间是关键。
  2. 仅在主题级别上无法保证订购

答案 2 :(得分:0)

我有一篇关于深入理解Kafka提供的排序保证的文章。 您可以在我的媒体 post 中查看。