我目前正在bunny使用RabbitMQ(VersionEye)通过GitHub API导入有关GitHub repos的元信息。根据GitHub repos的数量,任务可以在几秒钟内查看。我创建了一个像这样的新消息/任务:
queue.publish( msg, :persistent => true )
其中一名工作人员将收到消息并执行工作。工作人员在Memcached中设置其状态(RUNNING,DONE)。这样我知道什么时候完成任务!
我想在这个过程中摆脱Memcached。我想从RabbitMQ获得一个msg的状态。这样的事情是理想的:
status = queue.publish( msg, :persistent => true )
status = queue.status( msg )
不幸的是,我无法在RabbitMQ或Bunny文档中找到类似的内容。 有人知道如何从RabbitMQ获取消息的状态吗?
答案 0 :(得分:2)
没有这样的功能可以在RabbitMQ中获得特定的消息状态。
除了基于Memcache的跟踪消息状态的解决方案之外,您还可以使用RabbitMQ本身 - 在应用程序中声明特定于消息的队列并跟踪它的状态。整个概念非常接近Remote procedure call (RPC)。比如,如果它不存在 - 消息仍然在队列中,如果它存在 - 检查它内容(在收到消息时从消息消费者发送“消息接收”消息,并在处理消息时发送“消息处理”)。最大的缺点是你排队需要一些资源 - 主要是内存,如果你有大量的消息流,这很重要。此外,您还必须清理响应队列(可以使用queue ttl extension完成 - 不要与每个队列消息ttl混淆)。
以上述方式使用RabbitMQ首先要确保你真的需要这个(可能是你想要的老式RPC模式,+可能添加一些消息ttl + dead lettering支持以限制响应时间到合理的时间)。如果您确定,最好将大量队列移动到单独的vhost中,以便于维护队列的重置。另外,请确保不会超出服务器资源限制。