例如,我有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 怎么办?它被消耗掉了吗?
答案 0 :(得分:2)
您不会丢失数据,但是,根据您的应用程序,可能不支持添加分区,并且会破坏您的应用程序。
如果应用程序是无状态的,则只能添加分区。如果您的应用程序是有状态的,则您的应用程序很可能会崩溃并死于异常。
还请注意,Kafka Streams假定输入数据按键分区。因此,如果更改了分区,即使应用程序没有中断,也很可能会计算出错误的结果,因为添加分区违反了分区的假设。
解决此问题的一种方法是重置应用程序(cf)。但是,这意味着您失去了当前的应用程序状态。请注意,重置不会解决有关分区不正确的问题,并且您的应用程序可能会计算出错误的结果。为了再次防止分区问题,您可以插入一个伪map()
操作,该操作仅在从主题读取数据后才转发数据,因为如果需要,这将导致数据重新分区,从而修复基于键的分区。 / p>
答案 1 :(得分:0)
分区1 中键101 的 msg1 将被使用。
在Kafka Streams中,您不会“通过其键消费消息”。每个分区中的每个消息都将被消耗。如果有人要过滤密钥,它将在Kafka Stream App的代码中。