0

从这篇文章https://www.confluent.io/blog/transactions-apache-kafka/

使用为至少一次交付语义配置的 vanilla Kafka 生产者和消费者,流处理应用程序可能会以下列方式丢失恰好一次处理语义:

  1. 由于内部重试,producer.send() 可能导致消息 B 的重复写入。这是由幂等生产者解决的,不是本文其余部分的重点。

2.我们可能会重新处理输入消息A,导致重复的B消息被写入输出,违反了恰好一次处理的语义。如果流处理应用程序在写入 B 之后但在将 A 标记为已使用之前崩溃,则可能会发生重新处理。因此,当它恢复时,它将再次消耗 A 并再次写入 B,从而导致重复。

3. 最后,在分布式环境中,应用程序将崩溃,或者——更糟糕的是!——暂时失去与系统其余部分的连接。通常,新实例会自动启动以替换那些被认为丢失的实例。通过这个过程,我们可能有多个实例处理相同的输入主题并写入相同的输出主题,从而导致重复输出并违反恰好一次处理的语义。我们称之为“僵尸实例”问题。</p>

问题

在第 2 点,它提到当应用程序崩溃时,它将消耗 A 并再次写入 B 。但是生产者幂等性不是已经处理了这种发送重复的情况吗?就像第 1 点一样?

#3 点也会导致重复发送,#2 和 #3 不应该与 #1 相同吗?哪些可以使用生产者幂等处理?

4

1 回答 1

1

幂等生产者仅在每个分区级别和生产者的生命周期内保证 Exactly once 语义。

因此它能够涵盖场景 1)。

但是,如果生产者崩溃(甚至完全重新启动),这些保证将不再有效,就像您在 2) 和 3) 中描述的那样,它可能会导致重复。

要解决 2) 和 3),您可以使用事务生产者。它可以确保消息被原子地处理和提交,因此如果出现任何故障,中间工作将被正确丢弃,因此新实例的启动不会导致任何重复。此外,“僵尸”实例将被适当地隔离并防止违反恰好一次语义。

权衡是保证/速度。事务生产者提供更多保证,但可能会对性能产生影响。

无论如何,您选择哪个生产商取决于您的要求。请参阅文档的这两个部分,提供更多详细信息:

于 2019-08-02T08:31:48.570 回答