Kafka 如何处理比其他消费者慢 运行 的消费者?

How does Kafka handle a consumer which is running slower than other consumers?

假设我有 20 个分区和 5 个工人。每个分区分配一个工人。但是,一个工人 运行 比其他机器慢。它仍在处理中(也就是说,不是 慢消费者 描述的 here),但其他机器的处理速度为 60%。这可能是因为工作人员 运行 在 AWS EC2 上较慢的 VM 上、损坏的磁盘或 CPU 或诸如此类的原因。 Kafka 是否以某种方式优雅地处理再平衡,从而为慢速工作人员提供更少的分区?

Kafka 并不真正关心消息的消费速度。它甚至不涉及有多少消费者或每条消息被阅读了多少次。 Kafka 只是将消息提交到分区并在配置的时间将它们老化。

消费者组有责任确保消息被均匀且及时地阅读。在您的情况下,您有两个问题:一组分区的读取滞后,然后处理来自这些分区的消息滞后。

对于来自主题的消息的实际消费,您必须使用 Kafka 元数据 API 来跟踪每个消费者面临的相对负载,无论是通过偏斜分区还是因为消费者是 运行 以不同的速度。您要么必须将分区重新分配给消费者,以减少慢速消费者的工作量,要么随机将消费者重新分配给分区,以期随着时间的推移最终平衡工作负载。

为了更好地平衡消息的处理,您应该从消息的处理中分离出消息的读取——类似于 Storm 流模型。您仍然需要以编程方式监控处理逻辑中的积压,但您可以将工作转移到更快的节点以平衡工作。