kafka可以用作分布式工作队列吗

5anewei6  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(337)

我考虑将kafka用作分布式工作队列,多个工作人员可以从中检索任务。我最初的设计是:

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

这种设计的问题在于:
如果某个工作线程从主题中获取任务并立即提交偏移量,则在失败的情况下,该任务可能不会被重新处理。
如果某个工人从主题中获取任务,并且仅在完成时提交偏移量,那么其他工人也可以获取并处理该任务。如果任务持续时间很长,那么几乎所有的工人都会接受同一个任务并处理它,这完全抑制了分配的性质。
我正在寻找一种方法,将队列中的任务“标记”为“进行中”,这样其他人就不会使用它,但不会提交偏移量(因为它可能会失败,需要重新处理)。是否可以实施?

gr8qqesn

gr8qqesn1#

如果某个工作线程从主题中获取任务并立即提交偏移量,则在失败的情况下,该任务可能不会被重新处理。
在这种情况下,我建议使用手动提交并禁用使用者的auto.commit.offset配置。
如果某个工人从主题中获取任务,并且仅在完成时提交偏移量,那么其他工人也可以获取并处理该任务。如果任务持续时间很长,那么几乎所有的工人都会接受同一个任务并处理它,这完全抑制了分配的性质。
您可以通过使用分区设计主题和使用consumergroup设计消费者来处理这种情况。在kafka中,每个分区只能由一个使用者组中的一个使用者线程读取。
这意味着,只要您的所有消费者(或“工作者”)属于同一个消费者组,就不会有两个工作者开始阅读和处理同一条消息。

相关问题