在消费者重新平衡期间如何确保消息排序。假设我们最初有四个分区: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 :(得分:2)
在此期间,消费者c1可能正在处理来自分区p2的消息(重新平衡之前)
和消费者c2也开始处理p2消息(重新平衡后)
是。但这与消息排序有何关系?只要没有错误,c1应该完成当前记录的处理(比方说偏移X),重新平衡后c2将继续处理偏移量为X + 1的记录。
即使发生错误并且c1无法提交偏移X - c2将重新处理一些已经处理过的消息,但仍然会为分区p2保留该顺序。
如果具有偏移量X1的记录将在具有偏移X2<的偏移量的记录之前被处理,则分区将仅按顺序处理不。 X1。但事实并非如此(当然,你需要在失败的情况下排除重新处理)。
长话短说: 是的,这是设计行为
如果您构建无状态应用程序并且每个记录都是独立处理的,则此工作非常顺利。如果你想要状态,你需要确保在重新平衡之后(在c2开始处理数据之前)它从消费者c1转移到c2的分区p2的状态。移动状态实际上是一个棘手的问题,您应该考虑使用 Kafka Streams - Kafka的流处理库,它可以自动为您处理:http://docs.confluent.io/current/streams/index.html
答案 1 :(得分:0)
实际上没有跨分区的消息排序,所以这是一种预期的行为,其中C1在C2接管之前消耗P1并且在重新平衡之后开始读取。