Kafka - 消息排序保证

Posted

技术标签:

【中文标题】Kafka - 消息排序保证【英文标题】:Kafka - Message Ordering Guarantees 【发布时间】:2020-09-02 01:39:04 【问题描述】:

我遇到了两个关于排序的短语,

    生产者发送到特定主题分区的消息将被 按发送顺序附加。也就是说,如果发送了一条记录 M1 由与记录 M2 相同的生产者发送,首先发送 M1,然后发送 M1 将具有比 M2 更低的偏移量并在日志中更早出现。

另一个

    (config param) max.in.flight.requests.per.connection - 最大数量 客户端将在单个连接上发送的未确认请求 在阻塞之前。 请注意,如果此设置设置为大于 1 并且有失败的发送,有消息重新排序的风险 由于重试(即,如果启用重试)。

问题是,如果像提到的 #2 那样发送失败,订单是否仍会保留到特定分区?如果一条消息存在潜在问题,则以下所有消息将被丢弃“以保留每个分区的顺序”,或者将发送“正确”消息并将失败的消息通知给应用程序?

【问题讨论】:

【参考方案1】:

“如果像提到的 #2 那样发送失败,订单是否仍会保留到特定分区?”

正如您复制的文档部分所述,存在更改顺序的风险。

想象一下,您有一个主题,例如一个分区。您将retries 设置为100,将max.in.flight.requests.per.connection 设置为大于一的5。请注意,仅当您将 acks 设置为 1 或“全部”时,重试才有意义。

如果您计划按 K1、K2、K3、K4、K5 的顺序生成以下消息,并且您的生产者需要一些时间来

实际创建批处理并 向代理提出请求并 等待经纪人确认

最多可以并行处理 5 个请求(基于 max.in.flight.request.per.connection 的设置)。现在,生成“K3”有一些问题,它进入了重试循环,可以生成消息 K4 和 K5,因为请求已经在进行中。

您的主题最终会按以下顺序显示消息:K1、K2、K4、K5、K3。

如果您在 Kafka Producer 中启用 idempotency,则仍然可以保证排序,如Ordering guarantees when using idempotent Kafka Producer中所述

【讨论】:

hmm,这意味着“所说的”声明在所有方面都不是很好,这有点与声明相矛盾 - “在高级卡夫卡给出以下保证”也许有一些术语和应用条件。 呵呵,真的 :) 我认为魔鬼在“按照他们发送的顺序”的部分。 “Sent”这里的意思是:批处理,发送到broker,等待broker的确认,读起来不明显……尤其是max.in.flight.requests.per.connection的默认值其实是5。 也许值得一提的幂等性?

以上是关于Kafka - 消息排序保证的主要内容,如果未能解决你的问题,请参考以下文章

区块链:Hyperledger Fabric共识排序

区块链:Hyperledger Fabric共识排序

RocketMQ 顺序消费

分区数量超过消费者时的 Apache Kafka 消息消费

Kafka:那我走?这个新一代消息中间件,彻底爆火了!

NATS Jetstream 是不是通过密钥提供消息排序?