Kafka Producer 幂等性 - Exactly Once 还是 Just Producer Transaction 就足够了?
Kafka Producer Idempotence - Exactly Once or Just Producer Transaction is Enough?
来自这篇文章https://www.confluent.io/blog/transactions-apache-kafka/
使用为至少一次交付语义配置的香草 Kafka 生产者和消费者,流处理应用程序可能会通过以下方式丢失恰好一次处理语义:
- producer.send() 可能会由于内部重试而导致重复写入消息 B。这由幂等生产者解决,不是本文其余部分的重点 post。
2。
我们可能会重新处理输入消息 A,导致将重复的 B 消息写入输出,这违反了 exactly once 处理语义。如果流处理应用程序在写入 B 之后但在将 A 标记为已使用之前崩溃,则可能会发生重新处理。因此当它恢复时,它会再次消耗A并再次写入B,造成重复。
3。
最后,在分布式环境中,应用程序会崩溃或者——更糟!——暂时失去与系统其余部分的连接。通常,新实例会自动启动以替换被视为丢失的实例。通过这个过程,我们可能有多个实例处理相同的输入主题并写入相同的输出主题,导致重复输出并违反恰好一次处理语义。我们称之为“僵尸实例”问题。
问题
关于第2点,它提到当应用程序崩溃时,它将消耗A并再次写入B 。但是生产者幂等性不是已经处理了这种发送重复的情况吗?就像第 1 点一样?
#3 点也导致重复发送,#2 和#3 不应该和#1 是同一个问题吗?哪些可以使用生产者幂等性来处理?
幂等生产者仅在每个分区级别保证 Exactly once 语义,并且 在生产者的生命周期内。
所以它能够涵盖场景 1)。
但是,如果生产者崩溃(甚至完全重启),这些保证将不再有效,就像您在 2) 和 3) 中描述的那样,它可能会导致重复。
要解决 2) 和 3),您可以使用事务生产者。它可以确保消息以原子方式处理和提交,因此如果出现任何故障,中间工作将被正确丢弃,因此新实例的启动不会导致任何重复。此外 "zombie" 个实例将被适当地隔离并防止违反 exactly once 语义。
权衡是 guarantee/speed。事务生产者提供更多保证,但会对性能产生影响。
无论如何,您选择哪个制作人取决于您的要求。请参阅文档的这两个部分,提供更多详细信息:
来自这篇文章https://www.confluent.io/blog/transactions-apache-kafka/
使用为至少一次交付语义配置的香草 Kafka 生产者和消费者,流处理应用程序可能会通过以下方式丢失恰好一次处理语义:
- producer.send() 可能会由于内部重试而导致重复写入消息 B。这由幂等生产者解决,不是本文其余部分的重点 post。
2。 我们可能会重新处理输入消息 A,导致将重复的 B 消息写入输出,这违反了 exactly once 处理语义。如果流处理应用程序在写入 B 之后但在将 A 标记为已使用之前崩溃,则可能会发生重新处理。因此当它恢复时,它会再次消耗A并再次写入B,造成重复。
3。 最后,在分布式环境中,应用程序会崩溃或者——更糟!——暂时失去与系统其余部分的连接。通常,新实例会自动启动以替换被视为丢失的实例。通过这个过程,我们可能有多个实例处理相同的输入主题并写入相同的输出主题,导致重复输出并违反恰好一次处理语义。我们称之为“僵尸实例”问题。
问题
关于第2点,它提到当应用程序崩溃时,它将消耗A并再次写入B 。但是生产者幂等性不是已经处理了这种发送重复的情况吗?就像第 1 点一样?
#3 点也导致重复发送,#2 和#3 不应该和#1 是同一个问题吗?哪些可以使用生产者幂等性来处理?
幂等生产者仅在每个分区级别保证 Exactly once 语义,并且 在生产者的生命周期内。
所以它能够涵盖场景 1)。
但是,如果生产者崩溃(甚至完全重启),这些保证将不再有效,就像您在 2) 和 3) 中描述的那样,它可能会导致重复。
要解决 2) 和 3),您可以使用事务生产者。它可以确保消息以原子方式处理和提交,因此如果出现任何故障,中间工作将被正确丢弃,因此新实例的启动不会导致任何重复。此外 "zombie" 个实例将被适当地隔离并防止违反 exactly once 语义。
权衡是 guarantee/speed。事务生产者提供更多保证,但会对性能产生影响。
无论如何,您选择哪个制作人取决于您的要求。请参阅文档的这两个部分,提供更多详细信息: