为什么需要一个消息队列来与Web套接字聊天?

Ali*_*can 6 message-queue rabbitmq socket.io

我在互联网上看到很多使用网络套接字和RabbitMQ(https://github.com/videlalvaro/rabbitmq-chat)聊天的例子,但我不明白为什么它需要一个聊天应用程序的消息队列.

为什么不能通过Web套接字将消息从浏览器发送到服务器,然后服务器使用广播方法再次使用Web套接字将该消息广播到其余的活动浏览器?(也许我错过了什么)

伪代码示例(使用socket.io):

// client (browser)
socket.emit("message","my great message that will be received by all"


// server (any server can be, but let's just say that it is also written in JavaScript
socket.on("message", function(msg) {
  socket.broadcast.emit(data);
});

// the rest of the browsers
socket.on("message", function(msg) {
  // display on the screen the message 
});
Run Code Online (Sandbox Code Playgroud)

War*_*War 7

简单的回答...

对于一个简单的聊天应用程序,您不需要队列(例如,signalr 将在没有队列的情况下执行此操作)。

通常,虽然现实世界的应用程序不仅仅是“一个简单的聊天应用程序”,但队列可能代表新用户加入的房间的当前状态,因此服务器知道发生这种情况时要提供的消息列表。

另外值得注意的是,当您想要可靠的消息传递(例如服务总线)时,通常会实现消息队列,以确保即使第一次尝试失败,所有消息也确实到达它们应该去的地方。因此,队列很可能包含在许多示例中,作为以后解决问题的默认入门。


Der*_*ley 6

我个人认为RabbitMQ不应该用于聊天室.至少,不是在应用程序的"聊天"或"房间"部分.

除非你的聊天室根本不关心历史 - 我认为大多数人都关心这一点 - 像RMQ这样的消息队列没有多大意义.

你最好将消息存储在数据库中,并为每个用户保留一个标记,说出他们上次看到的消息.

现在,您可能最终需要像RMQ这样的东西来促进聊天应用程序的过程.例如,您可以从Web服务器卸载进程,并将所有消息通过RMQ推送到更新数据库和缓存层的后端服务.

这将允许您更快地扩展前端Web服务器,并为每个Web服务器支持更多用户.这听起来好像是使用RMQ,但不是特定于聊天应用程序.这只是扩展Web应用程序/系统的好习惯.

根据我的经验,关键是RMQ不负责将消息传递给用户/聊天室.这通过设计为每个用户使用的websockets或类似技术发生.

  • 基本上 RabbitMQ 有助于实时应用程序,因为接收请求的主服务器可以将其发送到 RMQ,然后 RMQ 可以将其发送给多方。优化是这样一个事实,即主服务器将只向 RMQ 发出一个请求,然后可以自由地接受其他客户端。(这样他不负责更新所有各方)这是正确的吗? (3认同)