【问题标题】:RabbitMQ: Delete a queue if consumer is gone forever?RabbitMQ:如果消费者永远消失了,请删除队列?
【发布时间】:2015-09-22 02:15:01
【问题描述】:

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

但是,如果客户离开后再也没有回来(停止使用服务)怎么办?如果消息有一段时间没有被消费,RabbitMQ 是否有办法删除队列?消息可能会进来,但不会出去,因为客户端不再处于活动状态。我如何使用 amqp.node 插件处理这个问题?

【问题讨论】:

标签: javascript node.js rabbitmq amqp


【解决方案1】:

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

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

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

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

这并不能解决问题。

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

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

您可以将队列设置为在所有消费者断开连接后自动删除。但是保留队列需要每个用户队列有一个消费者,只要该用户存在,消费者就会一直连接。如果应用程序崩溃,队列和它的所有消息都会消失。

TTL 只会做你想做的一部分。它将为队列中的消息赋予生命,并且该消息将在超时后被删除......但它不会删除队列。

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

再次,来自my article on the subject

回到原来的场景,当 用户不在线,您不能立即向他们发送消息吗?

将消息存储在数据库中。

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

上面开始的全过程,然后变成这样:

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

这是您在产生消息之前会做的事情 排队进来玩吧?这应该是你现在要做的 你也有一个消息队列。

【讨论】:

  • 这并没有回答我的问题,但它回答了“我应该如何接近我想做的事情?”的问题。所以我接受了。你是对的!我最初使用数据库来存储这些消息,但发现 RabbitMQ 并认为它几乎是一种“消息数据库”,这是不正确的。谢谢你让我大开眼界!快速提问...对于存储此信息的数据库,您有什么建议?
  • 是的,我希望回答意图而不是实际问题会更有价值:D 至于使用什么数据库?你通常用什么?您的应用程序/系统中已有什么数据库?坚持你对数据库的了解。
  • 我认为我们将使用 Redis 列表。 O(1) 插入和“pop”功能很棒。我正在考虑从 redis 列表中弹出值并通过网络套接字发送消息。我正在寻找“全部弹出”功能,但“当弹出返回不为空时”是另一种选择。
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2022-07-03
    相关资源
    最近更新 更多