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

标签 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

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

最佳答案

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

  • 让您的父进程发出请求并跟踪它发送了多少
  • 使父进程也等待特定的响应队列(子进程知道)
  • 每当 child 完成某事(或由于某种原因无法完成)时,向响应队列发送一条消息
  • 每当 numSent == numResponded , 大功告成

  • 要记住的是超时——如果子进程死了会发生什么?你必须做更多的工作,但基本上:
  • 对于每条发送的消息,包括某种 ID,并将该 ID 和当前时间添加到哈希表中。
  • 对于每个响应,从哈希表中删除该 ID
  • 定期遍历哈希表并删除任何超时的内容

  • 这称为 Request Reply Pattern .

    关于sql - 如何知道一组RabbitMQ任务何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7734597/

    相关文章:

    php - MySQL INNER JOIN 复制一列

    security - CQRS 应用跨领域问题,例如安全性

    networking - 为什么 MQTT 被称为 "light weight"消息协议(protocol)?

    rabbitmq - 使用兔子监听器的 Spring amqp 转换器问题

    RabbitMQ:发布者确认中的奇怪行为

    mysql - 分组后的随机数据

    php - 如何补偿 MySQL 时区差异?

    JAVAFX:从数据库加载图像

    concurrency - 聊天机器人 : ensuring serial processing of messages on a per-conversation basis in clustered environment

    java - 建立套接字连接时出错