我有一个小项目,它使用Redis作为任务队列。以下是它的基本工作原理。
我在系统中有两个组件:桌面客户端(可以多个)和服务器端应用。服务器端应用程序对桌面客户端有拉动任务。当客户端到来时,将从中获取第一个可用的任务。由于任务具有id,当桌面客户端返回结果时,服务器端应用程序可以通过其id识别任务。基本上,我在Redis中执行以下操作:
当向桌面客户端提供任务时,我使用Redis中的RPOPLPUSH将id从队列列表移动到提供的列表。
当我从桌面客户端获得响应时,我使用LREM从提供的列表中获取给定的任务ID(如果失败,我得到的任务未提供或已经处理过,或者只是从未存在过 - 所以,我打破了执行)。然后我使用LPUSH将任务ID添加到处理列表中。鉴于我有独特的任务ID(在我的应用程序级别控制),我避免在Redis列表中重复。
当任务完成(从桌面客户端获得的结果被处理并以某种方式保存)时,我从处理列表中删除任务并从Redis中删除任务对象。
如果任何步骤出现任何问题(即任务卡在处理或提供的列表上),我可以将任务移回队列列表并重新处理。
现在,问题是:在某种程度上可以在Apache Kafka中做类似的事情吗?我不需要Redis中的确切行为 - 我只需要能够向桌面客户端提供任务(不应该两次提供相同的任务)并根据实际情况标记/更改其状态处理状态(新的,提供的,处理的),以便我可以控制进程并恢复由于某些问题而未处理的任务。如果有可能,有人可以描述适用的工作流程吗?
答案 0 :(得分:0)
kafka可以作为标准队列。查看consumer group功能。
如果问题与适当性有关,请参阅Is Apache Kafka appropriate for use as a task queue?
我们正在使用kafka作为任务队列,其中一个支持kafka的考虑因素是它已经在我们的应用程序生态系统中,发现它比添加一个更多的组件更容易。