如果添加新分区,我们可以在Kafka Streams中丢失消息吗?

时间:2018-10-31 12:29:12

标签: java apache-kafka apache-kafka-streams

例如,我有4个分区。 将 键101 的消息 msg1 放入分区1 (4中的 >)和还没有使用 。同时添加了一个新分区,总共有5个分区。

然后, 键101 的下一条消息 msg2 进入第四分区(例如),因为hash(101)%no_of_partitions=4

现在,在流API中,每当消息被其键使用时,将为该键访问分区4,因为该分区是在计算hash(101)%no_of_partitions时获得的分区,因此它得到< 分区4 中的 键101 的strong> msg2 。

现在,分区1 键101 msg1 怎么办?它被消耗掉了吗?

2 个答案:

答案 0 :(得分:2)

您不会丢失数据,但是,根据您的应用程序,可能不支持添加分区,并且会破坏您的应用程序。

如果应用程序是无状态的,则只能添加分区。如果您的应用程序是有状态的,则您的应用程序很可能会崩溃并死于异常。

还请注意,Kafka Streams假定输入数据按键分区。因此,如果更改了分区,即使应用程序没有中断,也很可能会计算出错误的结果,因为添加分区违反了分区的假设。

解决此问题的一种方法是重置应用程序(cf)。但是,这意味着您失去了当前的应用程序状态。请注意,重置不会解决有关分区不正确的问题,并且您的应用程序可能会计算出错误的结果。为了再次防止分区问题,您可以插入一个伪map()操作,该操作仅在从主题读取数据后才转发数据,因为如果需要,这将导致数据重新分区,从而修复基于键的分区。 / p>

答案 1 :(得分:0)

分区1 键101 msg1 将被使用。

在Kafka Streams中,您不会“通过其键消费消息”。每个分区中的每个消息都将被消耗。如果有人要过滤密钥,它将在Kafka Stream App的代码中。