【发布时间】:2017-06-15 08:12:29
【问题描述】:
我有一个将 Redis 用于任务队列的小项目。以下是它的基本工作原理。
我的系统中有两个组件:桌面客户端(可以不止一个)和一个服务器端应用程序。服务器端应用为桌面客户端提供任务拉动。当客户到来时,拉取的第一个可用任务被分配给它。由于任务有一个 id,当桌面客户端返回结果时,服务器端应用程序可以通过它的 id 识别任务。基本上,我在 Redis 中执行以下操作:
- 将所有任务保存为对象。
- 将任务队列(池)保存在多个列表中:queue、provided、processing。
当向桌面客户端提供任务时,我在 Redis 中使用 RPOPLPUSH 将 id 从队列列表移动到 provided 列表。
当我收到来自桌面客户端的响应时,我使用 LREM 作为 provided 列表中的给定任务 ID(如果失败,我得到一个未提供或已处理的任务,或者只是从未存在过——所以,我打破了执行)。然后我使用 LPUSH 将任务 ID 添加到 processing 列表中。鉴于我有唯一的任务 ID(在我的应用程序级别控制),我避免在 Redis 列表中重复。
任务完成后(从桌面客户端得到的结果被处理并以某种方式保存),我从 processing 列表中删除任务并从 Redis 中删除任务对象。
如果任何步骤出现问题(即任务卡在处理或提供的列表中),我可以将任务移回队列列表并重新处理。
现在,问题是:是否有可能在 Apache Kafka 中做类似的事情?我不需要 Redis 中的确切行为 - 我需要的只是能够向桌面客户端提供任务(不可能两次提供相同的任务)并根据实际情况标记/更改其状态处理状态(新的,提供的,处理中),以便我可以控制进程并恢复由于某些问题而未处理的任务。如果可能的话,谁能描述一下适用的工作流程?
【问题讨论】:
标签: apache-kafka