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

Why do you need a message queue for a chat with web sockets?

我在互联网上看到了很多使用 web 套接字和 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 
});

嗯,我不太明白你在找什么...

但在 RabbiMQ 中,您总是将消息发布到 exchange 并使用 queue.

使用消息

到"broadcast that message"你需要消耗它。

希望对您有所帮助

简单的回答...

对于简单的聊天应用程序,您不需要队列(例如,signalr 不需要队列就可以做到这一点)。

通常,虽然现实世界的应用程序不只是 "a simple chat app",但队列可能代表房间的当前状态,以便新用户加入,因此服务器知道在发生这种情况时要提供的消息列表。

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

我个人认为 RabbitMQ 不应该用于聊天室。至少,不在应用程序的 "chat" 或 "room" 部分。

除非您的聊天室根本不关心历史记录——我认为大多数人确实关心这一点——像 RMQ 这样的消息队列没有多大意义。

你最好 storing the message in a database 并为每个用户保留一个标记,以说明他们上次看到的消息。

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

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

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

我可能来晚了,因为消息领域在过去几年里变化很快。 WhatsApp 等应用程序不会将消息存储在其数据库中,并且还提供端到端加密。 来到 RabbitMQ,他们支持 MQTT 协议,这是低延迟高可扩展性应用程序的理想选择。因此,使用此类排队服务可以减轻服务器的繁重工作,并提供可扩展性和安全性等功能。