Redis中持久队列的工人管理

时间:2015-06-15 21:50:38

标签: design-patterns redis queue worker

使用LPUSHBRPOPLPUSHhttp://redis.io/commands/rpoplpush)在Redis中实现持久队列是一种众所周知的模式。但是,为了扩展,设计需要满足来自主任务队列BRPOPLPUSH的多个工作人员/消费者。

因此,规范似乎是每个工作者都有一个单独的processing_queue来记录特定工作人员正在处理的任务,这样工作人员就会记录剩下的工作,以防它退出在处理过程中。

我对此processing_queue有两个问题:

  1. 在工作人员processing_queue中随时可以理解最多一个项目/任务是否正确?我假设一个工作者首先检查主{0}之前processing_queue主任务队列中的剩余任务。如果是这样,我们可以使用BRPOPLPUSHRPOPLPOP中的任何一个在工作完成处理后删除任务(或者它可以简单地删除列表)。我们甚至可以使用集合而不是列表。是否有任何理由为什么这么多人选择使用LREM但没有别的?

  2. 我见过很多人建议使用相应工作人员的进程ID来识别个人LREM。但是,当旧工作人员退出并且新工作人员(最有可能)新进程ID生成时会发生什么。新员工如何查看其前任processing_queue以完成可能的遗留任务?我计划使用processing_queue来管理我的工作流程,如果这会产生影响。

1 个答案:

答案 0 :(得分:1)

  1. 这取决于。如果您只对让工作人员从主队列中取出工作感兴趣,请对其进行处理,然后进行冲洗并重复,然后再进行。然而,这不是一项艰难的要求,而是一种设计选择。例如,当您要序列化从主要作业派生的作业时,您可以让工作人员将其他项目推送到processing_queue

  2. 我对[{1}}不熟悉,但您可以保留一个单独的数据结构 - 排序集最适合这里 - 与您的工作人员相关'标识符作为元素,时间戳作为其分数。让您的员工定期更新他们的时间戳,当您启动新员工时,让他们检查那些已经闲置太久的员工的设置。如果发现这种情况,请尝试确定它实际上已经死亡,然后让新工作人员接管相关的Supervisor(即带有processing_queue)。