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

5 apache-kafka kafka-python kafka-producer-api

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

1. retries = 3
2. max.in.flight.requests.per.connection = 5
Run Code Online (Sandbox Code Playgroud)

那么一个分区内的消息可能不在send_order中.

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

ser*_*jja 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. 订单丢失.

我可能错了,但在这种情况下,即使max.in.flight.requests.per.connection设置为1 ,也可能发生重新排序,如果代理故障转移,您可能会丢失消息顺序,例如批次可以比之前的失败批次更早发送到代理,它应该去经纪人也是.

关于max.in.flight.requests.per.connection并且retries被设置在一起它甚至更简单 - 如果您对经纪人有多个未确认的请求,则第一个失败的请求将无序到达.

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

希望这可以帮助

  • 请注意,即使将max.in.flight.requests.per.connection设置为1,导致错误排序的不幸错误也已修复为0.10.0.0(KAFKA-3197).从下一个版本开始(仅几周之后),即使出现故障和重试,您也可以使用此参数保证严格的订单. (8认同)