Apache Kafka分区保证中的消息顺序

问题描述 投票:4回答:3

阅读有关主题分区中消息顺序的本文:https://blog.softwaremill.com/does-kafka-really-guarantee-the-order-of-messages-3ca849fd19d2

允许重试而不设置飞行中的最大请求数到1可能会更改记录的顺序,因为如果两个批处理发送到单个分区,第一个失败并且是重试但第二次成功,则第二批中的记录可能会首先出现。

据此,有两种类型的生产者配置可以实现订购保证:

max.in.flight.requests.per.connection=1 // can impact producer throughput

或替代项

enable.idempotence=true
max.in.flight.requests.per.connection //to be less than or equal to 5
max.retries // to be greater than 0
acks=all

有人可以解释第二种配置如何实现订单保证吗?另外,在第二个配置中,仅启用一次语义。

apache-kafka kafka-producer-api
3个回答
2
投票

enable.idempotence是作为kip-98的一部分引入的新设置(在kafka 0.11+中实现)。用户必须先将max.inflight设置为1。

它的工作方式(缩写)是生产者现在将序列号放到我们正在生产的产品批次上,并且经纪人跟踪与之相连的每个生产者的序列号。如果经纪人收到一批无序的订单(例如,第1批之后的第3批),它将拒绝它,并希望看到第2批(生产者将重新传输)。有关完整的详细信息,您应该阅读kip-98


2
投票

幂等 :(每个分区的语义顺序恰好一次)

幂等传递确保邮件准确传递一次在单个生命周期内转到主题的特定分区生产者而不会丢失数据。

Idempotent是在Kafka中实现一次精确语义的关键功能之一。最终将“ enable.idempotence = true”设置为每个分区一次,这意味着没有重复,特定分区没有数据丢失。如果发生错误,即使生产者发送消息多次,也将一次写入Kafka。对于单个分区,幂等生成器保证在出现代理错误的情况下每个分区都没有重复的可能性。

Kafka PID和序列号的生产者概念,以实现幂等,如下所述:

PID和序列号

幂等的生产者在生成消息时使用产品ID(PID)和序列号。生产者在发布的每个消息上保持递增的序列号,这些消息具有唯一的PID。代理始终将当前序列号与前一个序列号进行比较,如果新序列号不比上一个序列号大+1,则它会拒绝,从而避免重复;如果消息中丢失了更大的序列号,则代理会同时拒绝。

enter image description here

注:生产者重新启动时,将分配新的PID。所以仅针对单个生产者会话承诺了幂等性]

如果使用enable.idempotence = true,则最多可以将in.flight.requests.per.connection保持为5,并且可以实现顺序保证,从而带来更好的并行性并提高性能。

在使用重试和Acks设置的max.in.flight.requests.per.connection达到一定程度的保证之前,Kafka 0.11+中引入的幂等功能:

max.in.flight.requests.per.connection to 1
max.retries bigger number
acks=all

max.in.flight.requests.per.connection = 1:确保在重试邮件时不会发送其他邮件。

这将带来性能和吞吐量方面的成本,并且鼓励引入enable.idempotence功能以提高性能并同时保证订购。


0
投票

幂等生成器是一种如果您再次发送同一条消息,它将对消息序列没有任何影响的地方。因此,如果您使用enable.idempotence=true,也会在不设置max.in.flight.requests.per.connection=1的情况下仅产生一次语义。

© www.soinside.com 2019 - 2024. All rights reserved.