【问题标题】:Using Kafka instead of Redis for the queue purposes使用 Kafka 而不是 Redis 用于队列目的
【发布时间】:2017-06-15 08:12:29
【问题描述】:

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

我的系统中有两个组件:桌面客户端(可以不止一个)和一个服务器端应用程序。服务器端应用为桌面客户端提供任务拉动。当客户到来时,拉取的第一个可用任务被分配给它。由于任务有一个 id,当桌面客户端返回结果时,服务器端应用程序可以通过它的 id 识别任务。基本上,我在 Redis 中执行以下操作:

  1. 将所有任务保存为对象。
  2. 将任务队列(池)保存在多个列表中:queueprovidedprocessing

当向桌面客户端提供任务时,我在 Redis 中使用 RPOPLPUSH 将 id 从队列列表移动到 provided 列表。

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

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

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

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

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    kafka 可以充当标准队列。检查consumer group 功能。

    如果问题是关于适当性,也请参考Is Apache Kafka appropriate for use as a task queue?

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

    【讨论】:

      猜你喜欢
      • 2020-08-11
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 2015-01-17
      相关资源
      最近更新 更多