【问题标题】:How to know when a set of RabbitMQ tasks are complete?如何知道一组 RabbitMQ 任务何时完成?
【发布时间】:2011-10-12 02:23:53
【问题描述】:

我正在使用 RabbitMQ 让工作进程对视频文件进行编码。我想知道所有文件何时完成 - 即所有工作进程何时完成。

我能想到的唯一方法是使用数据库。当视频完成编码时:

UPDATE videos SET status = 'complete' WHERE filename = 'foo.wmv'
-- etc etc etc as each worker finishes --

然后检查是否所有视频都已编码:

SELECT count(*) FROM videos WHERE status != 'complete'

但如果我要这样做,我觉得我正在失去 RabbitMQ 作为多分布式工作进程机制的好处,因为我仍然需要手动维护数据库队列。

RabbitMQ 依赖是否有标准机制?也就是说“等这5个任务完成,完成后,再启动一个新任务?”

我不想让父进程将这些任务添加到队列中,然后“等待”每个任务返回“已完成”状态。然后我必须为每组视频维护一个单独的进程,此时与单个 ThreadPool 概念相比,我已经失去了解耦工作进程的优势。

我要求的东西是不可能的吗?或者,是否有广泛采用的标准解决方案来管理我错过的队列中任务的整体状态?

编辑:经过搜索,我发现了这个类似的问题:Getting result of a long running task with RabbitMQ

人们对此有什么特别的想法吗?

【问题讨论】:

    标签: sql messaging rabbitmq


    【解决方案1】:

    使用“响应”队列。我不知道关于 RabbitMQ 的任何细节,所以这是一般性的:

    • 让您的父进程发送请求并跟踪发送的请求数量
    • 让父进程也等待特定的响应队列(子进程知道)
    • 每当孩子完成某事(或由于某种原因无法完成)时,向响应队列发送一条消息
    • 只要numSent == numResponded,你就完成了

    需要记住的是超时——如果子进程死亡会发生什么?你必须做更多的工作,但基本上:

    • 对于每条发送的消息,都包含某种 ID,并将该 ID 和当前时间添加到哈希表中。
    • 对于每个响应,从哈希表中删除该 ID
    • 定期遍历哈希表并删除任何已超时的内容

    这称为Request Reply Pattern

    【讨论】:

    • 为引用模式名称点赞。
    【解决方案2】:

    根据 Brendan 非常有帮助的回答(应该被接受),我敲出了这张对某些人有帮助的快速图表。

    【讨论】:

      【解决方案3】:

      我已经实现了一个工作流,其中工作流状态机被实现为一系列队列。工作人员在一个队列上接收消息,处理工作,然后将相同的消息发布到另一个队列。然后另一种类型的工作进程接收该消息,等等。

      在您的情况下,听起来您需要实现Enterprise Integration Patterns(这是一本免费的在线书籍)中的一种模式,并有一个简单的工作人员来收集消息,直到完成一组工作,然后处理一个将单个消息发送到代表工作流下一步的队列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        • 2011-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多