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



假设每个用户都有自己的队列。当用户离线时,消息被放入队列,当他们重新连接时,他们接收所有这些消息。

但是,如果客户端离开并且不再回来(停止使用服务)怎么办?如果消息在一段时间内没有被使用,RabbitMQ是否有办法删除队列?消息可能会进来,但它们不会出去,因为客户机不再活动。我怎么能用安普处理这个。节点的插件?

假设每个用户都有自己的队列。当用户离线时,消息被放入队列,当他们重新连接时,他们接收所有这些消息。

这是一种常见的想法,但它会导致不幸的后果,你应该避免。

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

您可以通过为每个用户设置一个队列来解决这个问题。你可以设置您的代码,使web服务器只订阅一个当用户登录并可用时,为该用户排队。

这解决不了问题。

现在您有30,000条消息分布在1,000个队列中——这很糟糕情况本身。这需要RabbitMQ持久化队列和队列中的消息。当所有1000个用户同时登录你的系统?现在您的web服务器有1000个要处理的队列订阅。

当然,你可能会说你不会有那么多用户。但更糟的是。在您的情况下,您将无法以您想要的方式自动删除队列。

你可以设置一个队列,一旦所有消费者都断开连接就自动删除。但是保持队列将需要每个用户都有一个消费者队列,只要该用户存在,消费者就会被连接。如果应用程序崩溃,队列及其所有消息都将消失。

TTL将只执行您想要的部分操作。它将为队列中的消息设置一个生命周期,并且该消息将在超时后被删除…但它不会删除队列。

最终,你不希望在RabbitMQ中这样做。

再次引用我关于这个主题的文章:

回到最初的场景,当用户未在线,您不能立即发送消息给他们?

将消息存储在数据库中

在数据库记录中添加一个字段,说明此消息属于谁出现。当用户稍后重新连接时,查询数据库是否有此用户需要查看的消息,并在此时间发送它们。

上面开始的完整进程,然后变成这样:

  • 用户浏览器连接到SignalR/Socket。web . io/push/websockets服务器
  • Web服务器检查长时间内发生的更新队列运行进程
  • 当一个已登录用户的消息进来时
    • 如果用户登录后,通过websocket将消息广播到用户
    • 如果用户未登录,将消息存储在数据库
  • 当用户再次登录时,查询数据库并发送所有等待消息

这是你在有消息之前会做的事情排队是来玩的,对吧?这应该是你现在该做的您还有一个消息队列。

这似乎是可能的,但我自己还没有尝试过。看到:

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

看队列TTL在底部。"这可以控制队列在自动删除之前可以使用多长时间。"

要查看示例用法,node-amqp代码库中的这个测试可能很有启发性:

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

最新更新