【问题标题】:How can I acknowledge a Rabbitmq message using the message id only (in Go)?如何仅使用消息 ID(在 Go 中)确认 Rabbitmq 消息?
【发布时间】:2015-09-14 21:03:42
【问题描述】:

我构建了一个小型服务器 (golang) 来从 RabbitMQ 获取消息并通过 Websocket 将它们传送到连接的浏览器。
它工作得很好,但有一个警告:消息在通过 websocket 传递到浏览器时得到确认。对于大多数消息都可以,但有些消息可能非常重要。如果用户的浏览器收到了这些消息,但用户没有看到该消息,那么如果浏览器关闭或重新加载,该消息就会丢失。
有没有办法在以后根据消息 id(来自 Delivery 结构)确认消息?
用例是 一些 消息在用户明确确认它们时被确认,此时消息 id 被发送回工具以通过 RabbitMQ 进行确认。

【问题讨论】:

    标签: go rabbitmq amqp


    【解决方案1】:

    即使你能做到,这也是糟糕的设计。

    如果用户看不到该消息会怎样?您的网络服务器是否无限地挂在它上面?它是否将消息“nack”回队列?

    这些选项都不好。

    坚持每条消息,RabbitMQ 将开始遇到来自大量用户的数千条未确认消息的问题。将消息返回到队列中,您将在循环中循环处理消息,从而增加 Web 服务器和 RMQ 服务器上的 CPU 资源,以及两者之间的网络流量。

    这个问题的更好的解决方案是在将消息从 RabbitMQ 中提取出来之后将其存储在数据库中。当它被发送到浏览器/被浏览器查看时,更新数据库以反映这一点。

    来自我写的一篇尚未发表的文章:

    将消息存储在数据库中。

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

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

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

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

    【讨论】:

    • 当我们这样做时,将未传递的消息存储在数据库中而不是死信交换有什么好处?
    • 同样的问题出于同样的原因。 DLX 会将消息路由到不同的队列。此时,您处于相同的情况,因为您无法根据条件在队列中查询特定消息derickbailey.com/2015/07/22/…
    最近更新 更多