来源:https://kafka.apache.org/intro
“通过在主题中具有并行性(分区)的概念,Kafka能够为用户进程池提供排序保证和负载平衡。这是通过将主题中的分区分配给消费者组中的消费者来实现的,这样每个分区就被组中的一个消费者所使用。通过这样做,我们可以确保使用者是该分区的唯一读者,并按顺序使用数据。”
这只意味着每个消费者将按顺序处理消息,但在同一消费者群体中的各个消费者之间,它可能仍然是不正常的。例:三个分区。用户通过循环发送M1到P1,M2发送到P2,M3发送到P3,然后M4发送到P1,M5发送到P2,M6发送到P3。
现在我们有: P1: M1和M4 P2: M2和M5 P3: M3和M6
如果每个用户都绑定到一个分区,那么C1将按该顺序处理M1和M4,C2 process M2和M5等等。我们如何保证M2在M4被处理(由C1处理)之前被处理(由C2处理)?
还是我误会了什么?
发布于 2018-01-25 17:01:04
如何确保M2在M4被处理(由C1处理)之前(由C2处理)?
一般情况下你不能。
如果每个客户端绑定到一个分区,那么C1将按照该顺序处理M1和M4,C2 process M2和M5等等。
即使您有一个单独的使用者为主题使用所有分区,分区也将以不确定的顺序使用,并且无法保证您在所有分区之间的总顺序。
还是我误会了什么?
不,你的理解是正确的。排序仅在单个分区上得到保证。
作为维沙尔约翰writes
例如,假设您的消息是基于user_id进行分区的,并考虑4条具有user_ids 1、2、3和4的消息,假设您有一个具有4个分区的“用户”主题。 由于分区是基于user_id的,所以假设具有user_id 1的消息将转到分区1,具有user_id 2的消息将转到分区2,等等。 还假设您有4个消费者用于该主题。因为您有4个使用者,Kafka将把每个使用者分配给一个分区。因此,在这种情况下,只要4条消息被推送,消费者就会立即使用它们。
您可以实现缓冲和重新订购的使用者逻辑,但该逻辑的工作方式取决于您的特定用例。
https://stackoverflow.com/questions/48448066
复制相似问题