8

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

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

那么很可能一个分区中的消息可能不在 send_order 中。

Kafka 是否采取任何额外步骤来确保分区内的消息仅保持发送顺序,或者使用上述配置,分区内可能有乱序消息?

4

1 回答 1

14

抱歉不行。

使用您当前的配置,由于您的retriesmax.in.flight.requests.per.connection设置,消息可能会无序到达。

retries如果 config 设置为大于 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.connectionretries设置在一起,它甚至更简单 - 如果您对代理有多个未确认的请求,则第一个失败的请求将无序到达。

但是,请注意这仅适用于消息/批次由于某种原因无法确认的情况(发送给错误的代理、代理死亡等)

希望这可以帮助

于 2016-04-18T13:09:17.043 回答