Apache Kafka 在并行向代理发送多条消息时如何维持秩序?



默认情况下,max.in.flight.requests.per.connection == 5表示 Kafka 最多会并行向代理发送 5 条消息。如果这些消息并行进入同一分区,它如何管理顺序?

如果设置retries > 0,Kafka 无法保证这些消息的顺序。

如果要获得排序保证,则需要将此值设置为max.in.flight.requests.per.connection == 1

Kafka 文档中对生产者配置retries给出了解释:

允许重试而不将 max.in.flight.requests.per.connection 设置为 1 可能会更改记录的顺序,因为如果将两个批处理发送到单个分区,并且第一个批处理失败并重试,但第二个批处理成功,则第二个批处理中的记录可能会首先出现。

默认情况下,使用max.in.flight.requests.per.connection> 1,可以对批处理进行重新排序。

如果要保证订购,可以:

  • 设置max.in.flight.requests.per.connection=1.根据您的吞吐量,这可能会对性能产生重大影响。

  • 通过将enable.idempotence设置为true来使用幂等生产者。这样仍然可以利用max.in.flight.requests.per.connection=5,但也强制实施批量排序。启用幂等性后,生产者会将序列号分配给所有批次,以便代理可以验证其订单。性能影响通常非常小。

最新更新