从这篇文章https://www.confluent.io/blog/transactions-apache-kafka/
使用为至少一次交付语义配置的 vanilla Kafka 生产者和消费者,流处理应用程序可能会以下列方式丢失恰好一次处理语义:
- 由于内部重试,producer.send() 可能导致消息 B 的重复写入。这是由幂等生产者解决的,不是本文其余部分的重点。
2.我们可能会重新处理输入消息A,导致重复的B消息被写入输出,违反了恰好一次处理的语义。如果流处理应用程序在写入 B 之后但在将 A 标记为已使用之前崩溃,则可能会发生重新处理。因此,当它恢复时,它将再次消耗 A 并再次写入 B,从而导致重复。
3. 最后,在分布式环境中,应用程序将崩溃,或者——更糟糕的是!——暂时失去与系统其余部分的连接。通常,新实例会自动启动以替换那些被认为丢失的实例。通过这个过程,我们可能有多个实例处理相同的输入主题并写入相同的输出主题,从而导致重复输出并违反恰好一次处理的语义。我们称之为“僵尸实例”问题。</p>
问题
在第 2 点,它提到当应用程序崩溃时,它将消耗 A 并再次写入 B 。但是生产者幂等性不是已经处理了这种发送重复的情况吗?就像第 1 点一样?
#3 点也会导致重复发送,#2 和 #3 不应该与 #1 相同吗?哪些可以使用生产者幂等处理?