3

我目前在VersionEye使用 RabbitMQ ( bunny )通过 GitHub API 导入有关 GitHub 存储库的元信息。根据 GitHub 存储库的数量,一个任务可能需要几秒钟到几分钟的查看时间。我像这样创建一个新消息/任务:

queue.publish( msg, :persistent => true )

其中一名工人将收到消息并执行工作。worker 在 Memcached 中设置他的状态(RUNNING,DONE)。这样我就知道什么时候完成任务了!

我想在那个过程中摆脱 Memcached。我想从 RabbitMQ 获取消息的状态。像这样的东西是理想的:

status = queue.publish( msg, :persistent => true )
status = queue.status( msg ) 

不幸的是,我在 RabbitMQ 或 Bunny 文档中找不到类似的东西。有人知道如何从 RabbitMQ 获取消息的状态吗?

4

1 回答 1

2

开箱即用的 RabbitMQ 中没有这样的功能可以获取特定的消息状态。

除了基于 Memcache 的解决方案来跟踪消息状态,您可以使用 RabbitMQ 本身 - 在应用程序中声明特定于消息的队列并跟踪它的状态。整个概念非常接近远程过程调用(RPC)。比如说,如果它不存在 - 消息仍在队列中,如果它存在 - 检查它的内容(在收到消息时从消息使用者发送“收到消息”消息,在处理消息时发送“消息已处理”)。最大的缺点是你的队列需要一些资源——主要是内存,如果你有巨大的消息流,这很重要。您还必须清理响应队列(可以通过队列 ttl 扩展来完成- 不要与每个队列消息 ttl 混淆)。

要以上述方式使用 RabbitMQ,首先要确保您确实需要它(也许老式 RPC 模式是您想要的,+ 可能添加一些消息 ttl + 死信支持以将响应时间限制在合理的时间)。如果您确定,将大量队列移动到单独的虚拟主机以方便维护队列重置总是一个好主意。还要确保您不会超过服务器资源限制。

于 2014-09-14T15:45:46.677 回答