使用Kafka而不是Redis用于队列目的

时间:2017-01-30 08:14:09

标签: apache-kafka

我有一个小项目,它使用Redis作为任务队列。以下是它的基本工作原理。

我在系统中有两个组件:桌面客户端(可以多个)和服务器端应用。服务器端应用程序对桌面客户端有拉动任务。当客户端到来时,将从中获取第一个可用的任务。由于任务具有id,当桌面客户端返回结果时,服务器端应用程序可以通过其id识别任务。基本上,我在Redis中执行以下操作:

  1. 将所有任务保留为对象。
  2. 将任务的队列(池)保留在多个列表中:队列提供处理
  3. 当向桌面客户端提供任务时,我使用Redis中的RPOPLPUSH将id从队列列表移动到提供的列表。

    当我从桌面客户端获得响应时,我使用LREM从提供的列表中获取给定的任务ID(如果失败,我得到的任务未提供或已经处理过,或者只是从未存在过 - 所以,我打破了执行)。然后我使用LPUSH将任务ID添加到处理列表中。鉴于我有独特的任务ID(在我的应用程序级别控制),我避免在Redis列表中重复。

    当任务完成(从桌面客户端获得的结果被处理并以某种方式保存)时,我从处理列表中删除任务并从Redis中删除任务对象。

    如果任何步骤出现任何问题(即任务卡在处理或提供的列表上),我可以将任务移回队列列表并重新处理。

    现在,问题是:在某种程度上可以在Apache Kafka中做类似的事情吗?我不需要Redis中的确切行为 - 我只需要能够向桌面客户端提供任务(不应该两次提供相同的任务)并根据实际情况标记/更改其状态处理状态(新的,提供的,处理的),以便我可以控制进程并恢复由于某些问题而未处理的任务。如果有可能,有人可以描述适用的工作流程吗?

1 个答案:

答案 0 :(得分:0)

kafka可以作为标准队列。查看consumer group功能。

如果问题与适当性有关,请参阅Is Apache Kafka appropriate for use as a task queue?

我们正在使用kafka作为任务队列,其中一个支持kafka的考虑因素是它已经在我们的应用程序生态系统中,发现它比添加一个更多的组件更容易。