java - 如果添加新分区,会丢失 Kafka Streams 中的消息吗?

标签 java apache-kafka apache-kafka-streams

例如,我有 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 101msg2

现在,分区 1 key 101msg1 怎么样?到底消耗掉了吗?

最佳答案

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

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

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

解决此问题的一种方法是重置您的应用程序(参见)。然而,这意味着您失去了当前的应用程序状态。请注意,重置并不能解决分区不正确的问题,并且您的应用程序可能会计算出不正确的结果。为了防止分区问题,您可以插入一个虚拟的 map() 操作,该操作仅在从主题读取数据后转发数据,因为这将导致数据在需要时重新分区,从而修复 key 基于-的分区。

关于java - 如果添加新分区,会丢失 Kafka Streams 中的消息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53083364/

相关文章:

java - 更新 Eclipse RCP 项目中零件中的 TableView 的正确方法是什么?

hadoop - 将数据从 RDBMS 加载到具有多个目的地的 Hadoop

java - Kafka Streams 中流-流连接的默认 WindowBytesStoreSupplier 是什么?

java - 加入 Kafka Streams 如何获取原始记录

java - 如何在android中的数据库上更改数据时得到通知?

java - 计算叶图中的节点数

apache-kafka - 通过 Observable(RxJava) 使用 Kafka

python - 反序列化 Avro 消息

java - Kafka 领导人选举导致 Kafka Streams 崩溃

java - 如何使用 encog AI 处理 3D 数据集