如何使用消息id来确认Rabbitmq消息(在Go中)



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

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

如果用户没有看到消息会发生什么?您的web服务器是否会无限地挂载它?它是否将消息"打包"回队列?

这两个选项都不好。

坚持每条消息,RabbitMQ将开始出现来自许多用户的数千条未确认消息的问题。把消息放回队列,你就会让消息在队列中来回转圈,占用web服务器和RMQ服务器上的CPU资源,以及两者之间的网络流量。

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

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

将消息存储在数据库中

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

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

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

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

最新更新