2016-12-06 93 views
0

消费者重新平衡期间如何确保消息订购。假设最初我们有四个分区: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消息(再平衡)之后

即使这是角落情况,这是消息排序的预期行为?

+0

你可以多一点清楚有关问题是有关的消息是什么排序? – yaswanth

+1

在重新平衡期间消息处理可能会失控 – ravthiru

回答

2

在此期间,有机会,消费者C1可能从分区P2处理消息(前再平衡)

和消费C2也开始处理P2消息(再平衡)之后

是。但是这与消息排序有什么关系?只要没有错误,c1应该完成处理当前记录(假设用偏移X),并且在重新平衡c2将继续处理具有偏移X + 1的记录。

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

如果在具有偏移量X2的记录之前处理具有偏移量X1的记录,则将按顺序处理分区将只有而不是 X1。但事实并非如此(当然,您需要排除故障后处理的重新处理)。

长话短说:是的,这是behavoir设计

如果你建立一个无状态的应用程序,每一个记录进行独立这项工作很顺利。如果需要状态,则需要确保在重新平衡之后(在c2开始处理数据之前)它从消费者c1转移到c2的分区p2的状态。移动状态实际上是一个棘手的问题,你应该考虑使用卡夫卡流 - 卡夫卡的流处理,可以自动处理这个对你的资料库:http://docs.confluent.io/current/streams/index.html

+0

谢谢,在给定密钥的使用情况下,按顺序处理消息非常重要,可能很少有像重新平衡之后的竞态条件1)在C1可以完成对分区p2中的X1的处理之前,C2可能已经处理了X + 1。 2)C1可能无法处理X1和C2完成处理X + 1。谢谢我们将考虑卡夫卡流 – ravthiru

+0

您描述的两种情况都是不可能的 - 在C2开始接管分区之前,C1完成处理,或者C1没有完成处理,C2将重试未完全处理的记录。 如果消费者C1没有死亡,仍然处理带有偏移量X的记录,并且分区被吊销并移交给C2,当C1尝试提交偏移量X时,代理不会允许这样做,因为C1不再拥有分区,因此提交将失败,并有例外。 –

+0

C2将用偏移量X与C1并行处理记录。因此,即使C1在C2完成处理记录X + 1之后完成处理记录X,也不重要,因为C2在处理记录X + 1之前处理了记录X.因此,你最终只能得到C2(X),C2(X + 1)C1(X)。不知道C1中的X的第二次处理是否对您的应用程序有害。 –

0

跨分区实际上没有消息排序,所以这是一个预期的行为,其中C1在C2接管它之前消耗P1,并在重新平衡之后开始读取。

+0

所有消费者都在同一组中,它是重新平衡期间在同一分区中的消息顺序 – ravthiru