资料来源:https://kafka.apache.org/intro
“通过在主题中具有分区并行性的概念,kafka能够在消费进程池上提供排序保证和负载平衡。这是通过将主题中的分区分配给使用者组中的使用者来实现的,这样每个分区只由组中的一个使用者使用。通过这样做,我们可以确保使用者是该分区的唯一读取器,并按顺序使用数据。”
这只意味着每个消费者都将按顺序处理消息,但在同一消费者组中的不同消费者之间,消息可能仍有问题。例:3个隔板。用户通过循环发送m1到p1,m2到p2,m3到p3,然后m4到p1,m5到p2,m6到p3。
现在我们有:p1:m1和m4 p2:m2和m5 p3:m3和m6
如果每个consuemr都绑定到一个分区,那么c1将按该顺序处理m1和m4,c2处理m2和m5,等等。我们如何保证在处理m4(由c1)之前(由c2)处理m2?
还是我误解了什么?
1条答案
按热度按时间hkmswyz61#
我们如何保证m2在m4被c1处理之前被c2处理?
一般来说你不能。
如果每个consuemr绑定到一个分区,那么c1将按该顺序处理m1和m4,c2处理m2和m5,依此类推。
即使只有一个使用者使用了主题的所有分区,这些分区也将以不确定的顺序使用,并且不能保证所有分区的总顺序。
还是我误解了什么?
不,你理解对了。只能在单个分区上保证排序。
正如vishal john所写:
例如,假设您的消息是基于用户标识进行分区的,并考虑4条具有用户标识1、2、3和4的消息。假设您有一个包含4个分区的“用户”主题。
由于分区是基于用户标识的,因此假设具有用户标识1的消息将转到分区1,具有用户标识2的消息将转到分区2,依此类推。。
另外,假设您有4个主题的使用者。由于您有4个使用者,kafka将把每个使用者分配到一个分区。因此,在这种情况下,只要推送4条消息,它们就会立即被消费者消费。
您可以实现缓冲和重新排序的使用者逻辑,但该逻辑的工作方式取决于您的特定用例。
另请参见:https://stackoverflow.com/a/39593834/741970.