问题描述
我正在考虑将Kafka用作多个工作人员可以从中检索任务的分布式工作队列。我的原始设计如下:
Work Producer ---> Kafka topic ------worker 1
|
|__worker 2
...
|__worker n
这种设计的问题是这样的:
-
如果某些工作人员从主题中提取任务并立即提交偏移,那么在失败的情况下,可能无法重新处理任务。
-
如果某些工作人员从主题中提取任务并仅在完成时提交偏移量,则其他工作人员也可能执行此任务并对其进行处理。如果任务持续很长时间,那么几乎所有的工人都将承担相同的任务并对其进行处理,从而完全抑制了分配性。
我正在寻找一种将队列中的任务“标记”为“进行中”的方式,因此它不会被其他任何人使用,但是不会提交offset(因为它可能会失败并且需要重新处理)。有可能实现吗?
解决方法
如果某个工作人员从主题中提取任务并立即提交偏移量,那么在失败的情况下,可能无法对该任务进行重新处理。
在这种情况下,我建议使用手动提交并禁用使用者的auto.commit.offset配置。
如果某个工作人员从主题中提取任务并仅在完成时提交偏移量,则其他工作人员也可能执行此任务并对其进行处理。如果任务持续很长时间,那么几乎所有的工人都将承担相同的任务并对其进行处理,从而完全抑制了分配性。
您可以通过使用分区设计主题,并使用ConsumerGroup设计使用者,以应对这种情况。在Kafka中,每个分区只能由使用者组中的一个使用者线程读取。
这意味着,只要您的所有消费者(或“工人”)都属于同一个ConsumerGroup,则绝不会,两个工人将开始阅读和处理同一条消息。
>