想象一下,每个用户都拥有自己的队列。当用户离线时,消息被放入队列,当他们重新连接时,他们会收到所有这些消息。
然而,如果客户离开并且永远不会回来(停止使用该服务)该怎么办?如果消息暂时没有消耗,RabbitMQ是否有办法删除队列?消息可能会进入,但它们不会消失,因为客户端不再处于活动状态。我怎么能用amqp.node插件处理这个?
答案 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代码库中的此测试可能会鼓舞人心: