2013-03-18 59 views
0

我通过amqplib在Python中使用rabbitmq。我尝试将AMQP用于不仅仅是一个队列的事情,如果可能的话 - 按ID搜索消息,在出队之前修改它们,在出队之前从队列中删除。这些东西用于存储/更新平衡器的真实用户队列,并且可以通过更改真实用户的状态来异步更新该队列(例如,用户已经死了 - 他的AMQP消息必须被删除,或者用户更改了它的状态 - 并且每一次这样的改变都必须反映在用户的AMQP队列中,适当的用户的AMQP消息中),并且在真正的出队消息发生之前。 我的问题有以下几点:带队列元素随机读取写入访问的消息队列(rabbitmq或)

  1. 是否有通过amqplib办法修改AMQP消息体中 一些queueN将它dequed之前,在 一些ID搜索它,它的头?我的意思是 - 我想修改邮件正文 由接收方调度它。

  2. 有没有办法让工作人员通过amqplib弹出 excactly 5(任意数量)来自queueN的最后一条消息?

  3. 我可以异步删除队列N中的消息,然后它将 dequed,它的邻居会把它放在queueN?

  4. 哪个是queueN中消息ID1的方法 - 获取它是真实的 当前队列的位置,从队列的起始点开始计数N? AMQP是否存储/更新任何消息是真正的队列位置?

    在此先感谢。

更新:根据rabbitmq文档,这种随机访问AMQP队列中的消息存在问题。请告知另一个Python正确的队列决定,它支持对它的元素进行快速异步访问 - 通过正文搜索消息,更新/删除队列消息,并获取任何队列消息的快速队列索引。我们用user_info尝试了deque + additional dict,但在这种情况下,我们需要在每次更新时锁定这个deque + dict,以避免竞争条件。主要目的 - 服务负载平衡器的队列并在计算队列中的更改时排除阻塞。

回答

0

您所描述的内容听起来像是一个非常典型的中间件管道。尽管在将消息传递给预期的使用者之前,它们具有相同的修改消息的效果,但通过访问队列无法工作。

其基本思想是所有的消息首先进入一个特殊的队列,并将它们传递给中间件。然后,中间件根据刚刚收到的信息编写一条新消息,并将该消息发布到预期收件人的队列中