如何知道一组RabbitMQ任务何时完成?

时间:2011-10-12 02:23:53

标签: sql messaging rabbitmq

我正在使用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

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

3 个答案:

答案 0 :(得分:9)

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

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

要记住的是暂停 - 如果子进程死亡会怎样?你必须做更多的工作,但基本上是:

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

这称为Request Reply Pattern

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

enter image description here

基于布伦丹(Brendan)非常有用的答案(应该接受),我敲出了这个快速图表,对某些人有帮助。