卡夫卡排序保证

Nag*_*Nag 4 apache-kafka kafka-producer-api

我正在浏览kafka文档并遇到了

保证

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

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

我有几个问题。

  1. 是否总是保证M1将具有比 更低的偏移量M2?如果M1重试晚于M2?
  2. 我也从各种文档中了解到,订购是不保证的,消费者必须自己处理。

Mar*_*usz 5

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

例如,如果您想从各种传感器收集消息,并且传感器有它的 id,那么如果您使用此 ID 作为消息键,则消费者将保证来自每个传感器的消息的顺序(因为没有传感器会将消息写入超过 1 个)分割)。

回答您的问题:

  1. 是的,M1偏移量总是低于M2。偏移量由代理设置,因此消息到达代理的时间是这里的关键。
  2. 仅在主题级别不保证订购


vah*_*hid 5

即使只有一个分区,一种可能的情况是:

  • 生产者发送 M1
  • 生产者发送 M2
  • M1 由于某些失败,在第一次尝试时没有被确认
  • M2 已交付
  • M1 在随后的尝试中交付。

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

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