【问题标题】:Blocking a Message Queue (RabbitMQ/SQS)阻塞消息队列 (RabbitMQ/SQS)
【发布时间】:2016-05-19 23:10:06
【问题描述】:

我有一个应用程序,我在其中将视频连接在一起以形成越来越长的蒙太奇。我正在尝试使用队列来承载串联作业,但遇到了问题。

我不能同时尝试将两个视频连接到同一个视频(否则我会丢失数据),因此正常队列不起作用(我有多个转码服务器)。

我认为我需要一个支持“阻塞”的队列(即,在我处理此视频的串联时,阻止所有其他尝试将串联作业从该队列中拉出,直到我完成)。然后,我将为每个目标视频创建一个单独的队列,这可能需要动态创建队列,因为新视频将成为连接的目标。

我已经为此研究了 RabbitMQ。似乎它可能会起作用,因为它支持“独占”连接。问题是似乎没有办法获取所有可用队列的列表,所以现在我不知道如何处理动态生成的队列。

非常感谢有关如何解决此问题的反馈。我完全不在基地吗?

【问题讨论】:

  • 一个 MQ 只是发送简单的消息,您可以在消息和程序逻辑中放入大量元数据以确保数据完整性。您应该期望消息队列服务中有一个“顺序”。队列就是先进先出。

标签: architecture rabbitmq amazon-sqs


【解决方案1】:

您并不是真的想要阻止,您只是想避免处理特定的视频片段,如果其他东西已经在这样做的话。您可能希望通过失败和重试来实现这一点。这在SQSRabbitMQ 中的实现略有不同。

基本上,您需要一个可以在视频上创建的锁,如果其他人拥有该锁,您希望让消息失败,并且在一定的超时后重试。您需要为最坏的情况设置足够高的延迟和重试(最大处理时间 * 最大段数),并输入 dead letter queue 以处理最终故障。

那里有很多好的Distributed Locking 实现。

【讨论】:

    【解决方案2】:

    RabbitMQ management client 插件有一个 api 来获取所有可用队列的列表:/api/queues

    点击该页面上的 API 链接了解更多详细信息(没有在答案中放置链接,因为链接会随着新的 API 版本快速过时)。

    【讨论】: