apachekafka分区保证中的消息顺序

os8fio9y  于 2021-06-04  发布在  Kafka
关注(0)|答案(3)|浏览(456)

阅读这篇关于主题分区中消息排序的文章:https://blog.softwaremill.com/does-kafka-really-guarantee-the-order-of-messages-3ca849fd19d2
允许重试而不将max.in.flight.requests.per.connection设置为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

有人能解释一下二次配置是如何实现订单保证的吗?同样在第二个配置中,只启用一次语义。

wgmfuz8q

wgmfuz8q1#

幂等生产者是这样的东西,如果你再次发送相同的消息,它将不会有任何影响的消息序列。所以,如果你用 enable.idempotence=true 也会导致语义正好一次没有设置 max.in.flight.requests.per.connection=1 .

gt0wga4j

gt0wga4j2#

enable.idempotence 是作为kip-98的一部分引入的较新设置(在kafka 0.11+中实现)。在此之前,用户必须将max.inflight设置为1。
它的工作方式(缩写)是,生产商现在把序列号放在我们正在生产的产品批次上,中间商跟踪每个与之相连的生产商的序列号。如果一个代理接收到一个无序的批(比如1之后的第3批),它会拒绝它,并期望看到第2批(生产者将重新传输)。有关完整的详细信息,请参阅kip-98

xsuvu9jc

xsuvu9jc3#

幂等:(每个分区的顺序语义正好是一次)
幂等传递使生产者能够在单个生产者的生命周期内,将消息准确地写入kafka一次主题的特定分区,而不会丢失每个分区的数据和顺序。
幂等性是Kafka实现精确一次语义的关键特征之一。设置“enable.idempotence=true”,最终每个分区只获得一次语义,这意味着没有重复,没有特定分区的数据丢失。如果发生错误,即使生产者多次发送消息也会被写入Kafka一次。
Kafka生产者的概念pid和序列号实现幂等如下所述:
pid和序列号
幂等生产者在生成消息时使用产品id(pid)和序列号。生产者不断增加的序列号对每个消息发布的唯一pidMap。代理程序总是将当前序列号与前一个序列号进行比较,如果新序列号不大于前一个序列号的+1(避免重复),则拒绝,如果大于则拒绝,同时显示消息丢失。

在故障情况下,它仍将保持序列号并避免重复,如下所示:

注意:当producer重新启动时,会分配新的pid。因此,幂等性只承诺用于单个生产者会话
如果您使用enable.idempotence=true,则可以将max.in.flight.requests.per.connection最多保留5个,并且可以实现订单保证,从而带来更好的并行性和提高性能。
在使用max.in.flight.requests.per.connection with retries and acks设置实现某种程度的保证之前,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.idemptence特性来提高性能,同时保证订购。
exactly_once:要实现exactly_once和幂等性,我们需要将事务设置为read_committed,并且不允许覆盖以下参数:
隔离。level:read_committed(使用者将始终只读取提交的数据)
enable.idempotence=true(生产者将始终启用幂等性)
每个连接的最大飞行中请求数=5(生产商每个连接将始终有一个飞行中请求)

相关问题