kafka幂等和交易生产者设置之间的区别?

Difference between kafka idempotent and transactional producer setup?

设置 kafka 生产者以使用幂等行为和事务行为时:

我理解为了幂等性我们设置: enable.idempotence=true 并且通过更改生产者上的这个标志,我们可以保证恰好一次事件传递?

对于交易,我们必须更进一步并设置 transaction.id=<some value> 但是通过设置这个值,它将幂等设置为真?

此外,通过将以上一项或两项设置为 true,生产者还将设置 acks=all。

有了上面的内容,我是否可以通过简单地更改启用幂等性设置来添加 'exactly once delivery'?如果我想更进一步并启用事务支持,在消费者方面,我只需要更改他们的设置,isolation.level=read_committed?此图像是否反映了如何根据 EOS 设置 producer

是的,您理解了主要概念。

通过启用幂等性,生产者自动将 acks 设置为 all 并保证在生产者实例的生命周期内传递消息。

通过启用事务,生产者自动启用幂等性(和 acks=all)。事务允许对生产请求和抵消提交进行分组,并确保全部或没有提交给 Kafka。

使用事务时,您可以通过将 isolation.level 设置为 read_committed 来配置消费者是否只应查看来自已提交事务的记录,否则默认情况下他们会看到所有记录,包括来自已丢弃事务的记录。

实际上,幂等性本身并不总是保证事件传递恰好一次。假设您有一个消费者消费一个事件,处理它并产生一个事件。在此过程中的某个地方,消费者使用的偏移量必须递增并持久化。如果没有事务性生产者,如果它发生在生产者发送消息之前,则消息可能不会被发送并且最多发送一次。如果您在消息发送后执行此操作,则可能无法持久保存偏移量,然后消费者将再次阅读相同的消息,生产者将发送副本,您至少会获得一次交付。事务生产者的全有或全无机制可以防止这种情况发生,因为您将偏移量存储在 kafka 上,新消息和消费者偏移量的增加成为一个原子操作。