RabbitMQ:如果消费者永远消失,请删除队列?

时间:2015-09-22 02:15:01

标签: javascript node.js rabbitmq amqp

想象一下,每个用户都拥有自己的队列。当用户离线时,消息被放入队列,当他们重新连接时,他们会收到所有这些消息。

然而,如果客户离开并且永远不会回来(停止使用该服务)该怎么办?如果消息暂时没有消耗,RabbitMQ是否有办法删除队列?消息可能会进入,但它们不会消失,因为客户端不再处于活动状态。我怎么能用amqp.node插件处理这个?

2 个答案:

答案 0 :(得分:1)

  

想象一下,每个用户都拥有自己的队列。当用户离线时,消息被放入队列,当他们重新连接时,他们会收到所有这些消息。

这是一个常见的想法,但是one with unfortunate consequences, that you should avoid

正如我在该链接文章中所写的那样:

  

您可以通过为每个用户建立一个队列来解决此问题。您   可以设置您的代码,以便Web服务器只订阅一个   该用户登录并可用时为该用户排队。

     

这不能解决问题。

     

现在,您在1000个队列中分发了30,000条消息 - 这很糟糕   情况本身。这需要RabbitMQ来保持队列和   队列中的消息。当所有1,000个用户都会发生什么   同时登录您的系统?现在您的Web服务器有1,000个   队列订阅处理。

当然,你可以说你不会有那么多用户。但它变得更糟。在您的情况下,您将无法自动删除所需的队列。

您可以将队列设置为在所有使用者断开连接后自动删除。但保持队列周围将需要每个用户队列的消费者,只要该用户存在,消费者就会连接到该消费者队列。如果应用程序崩溃,队列及其所有消息将消失。

TTL只会做你想要的一部分。它将在队列中的消息上生命,消息将在超时后被删除......但它不会删除队列。

最终,您不希望使用RabbitMQ执行此操作。

再次来自my article on the subject

  

回到原来的情景,你应该怎么做   用户不在线,你不能立即发送消息给他们?

     

将讯息存储在数据库中。

     

在数据库记录中添加一个字段,说明此消息属于谁   至。当用户稍后重新连接时,查询数据库以查找任何内容   此用户此时需要查看和发送的消息。

     

完整的过程从上面开始,然后变为:

     
      
  • 用户的浏览器连接到网络上的SignalR / Socket.io / Pusher / websockets   服务器
  •   
  • Web服务器检查队列中是否存在长时间内发生的更新   正在运行的流程
  •   
  • 当有登录用户的消息进入时      
        
    • 如果   用户登录后,通过websocket将消息广播到   用户
    •   
    • 如果用户未登录,请将消息存储在数据库中
    •   
  •   
  • 当用户再次登录时,查询数据库并发送所有等待   消息
  •   
     

这是你在创建消息之前所要做的   排队进来玩吧?它应该是你现在要做的   你也有一个消息队列。

答案 1 :(得分:-1)

似乎有可能,但我自己没有尝试过。参见:

https://www.rabbitmq.com/ttl.html

从底部向下看Queue TTL。 "它控制队列在被自动删除之前可以使用多长时间。"

要查看示例用法,node-amqp代码库中的此测试可能会鼓舞人心:

https://github.com/postwait/node-amqp/blob/f64704d3727266230901598e2daf0fa780766feb/test/test-queue-args.js#L8