Kafka能否用作分布式工作队列

Can Kafka be used as a distribute work queue

我正在考虑将 Kafka 用作分布式工作队列,多个工作人员可以从中检索任务。我的原始设计如下:

Work Producer ---> Kafka topic ------worker 1
                                  |
                                  |__worker 2
                                  ...
                                  |__worker n

这个设计的问题是:

  1. 如果某个工作人员从主题中获取任务并立即提交偏移量,则在失败的情况下可能不会重新处理任务。

  2. 如果某个工作人员从主题中接手任务并仅在完成时提交偏移量,那么其他工作人员也可能接手该任务并处理它。如果任务持续时间很长,那么几乎所有工作人员都会接受相同的任务并处理它,从而完全抑制分发性质。


我正在寻找一种方法将队列中的任务“标记”为“进行中”,这样它就不会被其他任何人使用,但不会提交偏移量(因为它可能会失败并需要重新处理)。是否可以实施?

If some worker takes a task from the topic and immediately commits offset then in case of failure the task may not be reprocessed.

在这种情况下,我建议使用手动提交并禁用消费者的 auto.commit.offset 配置。

If some worker takes a task from the topic and commits offset only on finish then other workers may also takes this task and process it. If the task is pretty long lasting then almost all workers will take the same task and process it completely inhibiting the distributing nature.

您可以通过设计带有分区的主题和带有 ConsumerGroup 的消费者来处理这种情况。在 Kafka 中,每个分区只能由一个消费者组中的一个消费者线程读取。

这意味着,只要您的所有消费者(或“工人”)都属于同一个消费者组,永远不会出现两个工人开始读取和处理同样的消息。