Kafka可以用作分发工作队列

问题描述

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

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

这种设计的问题是这样的:

  1. 如果某些工作人员从主题中提取任务并立即提交偏移,那么在失败的情况下,可能无法重新处理任务。

  2. 如果某些工作人员从主题中提取任务并仅在完成时提交偏移量,则其他工作人员也可能执行此任务并对其进行处理。如果任务持续很长时间,那么几乎所有的工人都将承担相同的任务并对其进行处理,从而完全抑制了分配性。


我正在寻找一种将队列中的任务“标记”为“进行中”的方式,因此它不会被其他任何人使用,但是不会提交offset(因为它可能会失败并且需要重新处理)。有可能实现吗?

解决方法

如果某个工作人员从主题中提取任务并立即提交偏移量,那么在失败的情况下,可能无法对该任务进行重新处理。

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

如果某个工作人员从主题中提取任务并仅在完成时提交偏移量,则其他工作人员也可能执行此任务并对其进行处理。如果任务持续很长时间,那么几乎所有的工人都将承担相同的任务并对其进行处理,从而完全抑制了分配性。

您可以通过使用分区设计主题,并使用ConsumerGroup设计使​​用者,以应对这种情况。在Kafka中,每个分区只能由使用者组中的一个使用者线程读取。

这意味着,只要您的所有消费者(或“工人”)都属于同一个ConsumerGroup,则绝不会,两个工人将开始阅读和处理同一条消息。

>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...