例如,我有 4 个分区。 当 key 101 的消息 msg1 被放入分区 1 时(共 4 个) >)并且尚未消耗。同时添加一个新分区,总共 5 个分区。
然后, key 101 的下一条消息 msg2 会转到第 4 个分区(例如),因为 hash(101)%no_of_partitions=4
.
现在,在流 API 中,每当消息被其键消耗时,都会访问分区 4 以获取该键,因为这是它在计算 hash(101)%no_of_partitions
时获得的分区。因此它会在分区 4 中获取 key 101 的 msg2。
现在,分区 1 中 key 101 的 msg1 怎么样?到底消耗掉了吗?
最佳答案
您不会丢失数据,但是,根据您的应用程序,添加分区可能不受支持,并且会破坏您的应用程序。
如果您的应用程序是无状态的,则只能添加分区。如果您的应用程序是有状态的,您的应用程序很可能会因异常而崩溃并死亡。
另请注意,Kafka Streams 假设输入数据按键分区。因此,如果分区发生更改,即使应用程序没有中断,它也很可能会计算出错误的结果,因为添加分区违反了分区假设。
解决此问题的一种方法是重置您的应用程序(参见)。然而,这意味着您失去了当前的应用程序状态。请注意,重置并不能解决分区不正确的问题,并且您的应用程序可能会计算出不正确的结果。为了防止分区问题,您可以插入一个虚拟的 map()
操作,该操作仅在从主题读取数据后转发数据,因为这将导致数据在需要时重新分区,从而修复 key 基于-的分区。
关于java - 如果添加新分区,会丢失 Kafka Streams 中的消息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53083364/