Kafka是否保证在具有任何配置参数值的单个分区中进行消息排序?

时间:2016-04-18 11:01:23

标签: apache-kafka kafka-producer-api kafka-python

如果我在Producer中将Kafka配置参数设置为:

1. retries = 3
2. max.in.flight.requests.per.connection = 5

然后很可能一个分区中的消息可能不在send_order中。

Kafka是否采取任何额外步骤以确保分区中的邮件仅保留在已发送的顺序中 要么 使用上述配置,可能会在分区内出现乱序消息吗?

1 个答案:

答案 0 :(得分:11)

不幸的是,没有。

根据您的当前配置,由于您的retriesmax.in.flight.requests.per.connection设置,有可能会出现无序消息..

如果retries配置设置为大于0,则在以下情况下将丢失排序(仅使用随机数的示例):

  1. 您将消息/批处理发送到位于代理0上的分区0,代理1和2是ISR。
  2. 经纪人0失败,经纪人1成为领导者。
  3. 您的消息/批处理返回失败,需要重试。
  4. 与此同时,您将下一条消息/批处理发送到分区0,该分区现在已知在代理1上,这发生在您的上一批实际重试之前。
  5. 消息/批次2得到确认(成功)。
  6. 重新发送消息/批次1,现在也得到确认。
  7. 订单丢失。
  8. 我可能错了,但在这种情况下,即使max.in.flight.requests.per.connection设置为1,也可能发生重新排序,如果代理故障转移,您可能会丢失消息顺序,例如批次可以比先前失败的批次更早地发送到代理,并且它也应该转到该代理。

    关于max.in.flight.requests.per.connectionretries被设置在一起它甚至更简单 - 如果您有多个未确认的请求到代理,第一个失败的请求将无序到达。

    但请注意,这仅与消息/批次由于某种原因未能确认的情况有关(发送给错误的经纪人,经纪人死亡等)。

    希望这有帮助