阅读这篇关于主题分区中消息排序的文章: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
有人能解释一下二次配置是如何实现订单保证的吗?同样在第二个配置中,只启用一次语义。
3条答案
按热度按时间wgmfuz8q1#
幂等生产者是这样的东西,如果你再次发送相同的消息,它将不会有任何影响的消息序列。所以,如果你用
enable.idempotence=true
也会导致语义正好一次没有设置max.in.flight.requests.per.connection=1
.gt0wga4j2#
enable.idempotence
是作为kip-98的一部分引入的较新设置(在kafka 0.11+中实现)。在此之前,用户必须将max.inflight设置为1。它的工作方式(缩写)是,生产商现在把序列号放在我们正在生产的产品批次上,中间商跟踪每个与之相连的生产商的序列号。如果一个代理接收到一个无序的批(比如1之后的第3批),它会拒绝它,并期望看到第2批(生产者将重新传输)。有关完整的详细信息,请参阅kip-98
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=1:确保消息重试时不会发送其他消息。
这提供了至少一次的保证,并带来了性能和吞吐量方面的成本,这就鼓励引入enable.idemptence特性来提高性能,同时保证订购。
exactly_once:要实现exactly_once和幂等性,我们需要将事务设置为read_committed,并且不允许覆盖以下参数:
隔离。level:read_committed(使用者将始终只读取提交的数据)
enable.idempotence=true(生产者将始终启用幂等性)
每个连接的最大飞行中请求数=5(生产商每个连接将始终有一个飞行中请求)