Apache kafka 消费者再平衡期间的卡夫卡消息排序

Apache kafka 消费者再平衡期间的卡夫卡消息排序,apache-kafka,Apache Kafka,如何在消费者重新平衡期间确保消息排序。假设最初我们有四个分区:p1、p2、p3、p4和两个使用者c1和c2(在同一组中)。因此,每个使用者获得两个分区,例如c1:p1、p2和c2:p3、p4 现在添加了新的消费者,比如c3和c4,重新平衡发生了,这样每个消费者都可以得到一个分区,比如c1:p1、c2:p2、c3:p3、c4:p4 在此期间,使用者c1可能正在处理来自分区p2的消息(在重新平衡之前) 消费者c2也开始处理p2消息(重新平衡后) 即使这是一种极端情况,这是消息排序的预期行为吗 实际上

如何在消费者重新平衡期间确保消息排序。假设最初我们有四个分区:p1、p2、p3、p4和两个使用者c1和c2(在同一组中)。因此,每个使用者获得两个分区,例如c1:p1、p2和c2:p3、p4

现在添加了新的消费者,比如c3和c4,重新平衡发生了,这样每个消费者都可以得到一个分区,比如c1:p1、c2:p2、c3:p3、c4:p4

在此期间,使用者c1可能正在处理来自分区p2的消息(在重新平衡之前)

消费者c2也开始处理p2消息(重新平衡后)


即使这是一种极端情况,这是消息排序的预期行为吗

实际上分区之间没有消息排序,因此这是一种预期行为,其中C1在C2接管P1之前消耗P1,并在重新平衡后开始读取

在此期间,使用者c1可能正在处理来自分区p2的消息(在重新平衡之前)

消费者c2也开始处理p2消息(重新平衡后)

对。但是这与消息排序有什么关系呢?只要没有错误,c1应该完成当前记录的处理(比如偏移量X),在重新平衡之后,c2将继续处理偏移量X+1的记录

即使发生错误并且c1未能提交偏移量X,c2也将重新处理一些已经处理过的消息,但分区p2的顺序仍将保留

如果偏移量为X1的记录将在偏移量为X2按顺序处理。但事实并非如此(当然,在失败的情况下,您需要排除再处理)

长话短说:是的,这是设计的行为


如果您构建了一个无状态应用程序,并且每个记录都是独立处理的,那么这项工作将非常顺利。如果需要状态,则需要确保分区p2的状态在重新平衡后(c2开始处理数据之前)从使用者c1传输到c2。移动状态实际上是一个棘手的问题,你应该考虑使用<强>卡夫卡流< /强> -卡夫卡的流处理库,它可以自动为你处理这个问题:

你能更清楚地知道关于消息排序的问题吗?在我们对给定密钥的用例中,按顺序处理消息是很重要的,可能会有一些竞争条件,比如在重新平衡1)C2可能在C1完成从分区p2处理X1之前处理了X+1。2) C1可能无法处理X1,C2完成处理X+1。谢谢,我们将研究卡夫卡流。您描述的两种情况都是不可能的——要么C1在C2开始接管分区之前完成了处理,要么C1没有完成处理,C2将重试未完全处理的记录。如果使用者C1未死亡,仍在处理偏移量为X的记录,并且分区被撤销并移交给C2,则当C1尝试提交偏移量为X时,代理将不允许这样做,因为C1不再拥有该分区,因此提交将异常失败。C2将与C1并行处理偏移量为X的记录。因此,即使C1会在C2处理完记录X+1之后处理完记录X,这也无关紧要,因为C2在处理完记录X+1之前处理过记录X。因此,你只能得到C2(X),C2(X+1)C1(X)。不确定C1中X的第二次处理是否对您的应用程序有害。我不知道这种情况“C1尝试提交偏移量X代理将不允许这样做,因为C1不再拥有该分区,因此提交将失败并出现异常”。处理两次是可以的,但应该按顺序进行。感谢您提供的帮助。所有消费者都在同一个组中,这是在重新平衡期间在同一分区中的消息顺序