带随机读写访问队列元素的消息队列(RabbitMQ等)

0 投票
1 回答
1012 浏览
提问于 2025-04-17 19:32

我在Python中使用rabbitmq,通过amqplib来实现。我想尝试用AMQP做一些不仅仅是排队的事情,如果可能的话,比如通过ID搜索消息、在出队之前修改消息、在出队之前从队列中删除消息。这些操作是用来存储和更新真实用户的队列,以便于负载均衡,而这个队列可能会因为真实用户状态的变化而异步更新(例如,用户死了——他的AMQP消息必须被删除,或者用户状态发生了变化——每次这样的变化都必须在用户的AMQP队列中反映出来,在相应用户的AMQP消息中),而且是在真正出队消息之前。

我的问题如下:

  1. 通过amqplib,有没有办法在某个队列中,根据消息头中的某个ID,在消息被出队之前修改AMQP消息的内容?我的意思是——我想在接收方处理消息之前修改消息内容。

  2. 有没有办法让一个工作者从队列中准确地取出最后5条(任意数量)消息?

  3. 我可以在消息被出队之前,异步地从队列中删除一条消息吗?这样它的邻居消息就可以填补这个位置?

  4. 对于队列中的消息ID1,如何获取它在队列中的实际当前位置信息,从队列开始算起?AMQP是否会存储或更新任何消息的实际队列位置?

    提前谢谢你。

更新:根据rabbitmq的文档,AMQP队列中的消息随机访问存在问题。请建议在Python中使用其他合适的队列方案,支持快速异步访问其元素——通过消息内容搜索、更新/删除队列消息,以及快速获取任何队列消息的索引。我们尝试过使用双端队列(deque)加上一个额外的字典来存储用户信息,但在这种情况下,我们需要在每次更新时锁定这个双端队列和字典,以避免竞争条件。主要目的是服务于负载均衡器的队列,并在计算队列变化时避免阻塞。

1 个回答

0

你说的听起来像是一个很常见的中间件流程。虽然这个流程可以在消息送到目标接收者之前对它们进行修改,但它并不是通过直接访问队列来实现的。

基本的想法是,所有的消息首先会进入一个特殊的队列,然后送到中间件。中间件会根据刚收到的消息,制作一个新的消息,并把这个新消息发布到目标接收者的队列里。

撰写回答