在 Recovery/Rebalance 上处理 Kafka 中未处理的记录
Processing Unprocessed Records in Kafka on Recovery/Rebalance
我正在使用 Spring Kafka 与我的 Kafka 实例进行交互。假设我有一个主题,比如说,有 2 个以上的分区。
例如,在我的 Spring 基于 Kafka 的应用程序崩溃(甚至重新平衡),然后重新上线并且主题中有消息等待的情况下,我目前正在使用每个分区的最新提交偏移量存储在外部存储中的策略,然后我查找消费者对分区的分配,然后寻找该偏移量以恢复处理。
(这是基于我在 O'Reilly 书中读到的策略。)
是否有更好的方法来处理这种情况以实现 "exactly once" 语义并且不错过任何等待消息?或者是否有 better/more 惯用的方法 Spring Kafka 来处理这种情况?
提前致谢。
有没有理由不检查 kafka 本身的偏移量?
一般来说,"exactly once" 处理的选项是:
- 以事务方式将抵消和副作用存储在一起。这只有在您的副作用进入具有事务能力的系统(比如数据库)时才有可能
- 使用kafka事务。这是 1 的简化变体,只要您的副作用进入您从
读取的同一个 kafka 集群
- 想出一个方案,允许您检测和忽略 kafka 管道下游的重复项(又名幂等性)
我正在使用 Spring Kafka 与我的 Kafka 实例进行交互。假设我有一个主题,比如说,有 2 个以上的分区。
例如,在我的 Spring 基于 Kafka 的应用程序崩溃(甚至重新平衡),然后重新上线并且主题中有消息等待的情况下,我目前正在使用每个分区的最新提交偏移量存储在外部存储中的策略,然后我查找消费者对分区的分配,然后寻找该偏移量以恢复处理。
(这是基于我在 O'Reilly 书中读到的策略。)
是否有更好的方法来处理这种情况以实现 "exactly once" 语义并且不错过任何等待消息?或者是否有 better/more 惯用的方法 Spring Kafka 来处理这种情况?
提前致谢。
有没有理由不检查 kafka 本身的偏移量?
一般来说,"exactly once" 处理的选项是:
- 以事务方式将抵消和副作用存储在一起。这只有在您的副作用进入具有事务能力的系统(比如数据库)时才有可能
- 使用kafka事务。这是 1 的简化变体,只要您的副作用进入您从 读取的同一个 kafka 集群
- 想出一个方案,允许您检测和忽略 kafka 管道下游的重复项(又名幂等性)