Socket.io 为什么您需要一个消息队列来与web套接字聊天?

Socket.io 为什么您需要一个消息队列来与web套接字聊天?,socket.io,rabbitmq,message-queue,Socket.io,Rabbitmq,Message Queue,我在internet上看到了许多使用web套接字和RabbitMQ()的聊天示例,但是我不明白为什么聊天应用程序需要它作为消息队列 为什么不能通过web套接字将消息从浏览器发送到服务器,然后服务器再使用web套接字和广播方法将消息广播到其他活动浏览器?(也许我遗漏了什么) 伪代码示例(使用socket.io): 嗯,我不太明白你到底在找什么 但是在RabbiMQ中,您总是将消息发布到交换,并使用队列使用消息 要“广播该消息”,您需要使用它 希望它能帮助你简单的回答 对于一个简单的聊天应用程序,您

我在internet上看到了许多使用web套接字和RabbitMQ()的聊天示例,但是我不明白为什么聊天应用程序需要它作为消息队列

为什么不能通过web套接字将消息从浏览器发送到服务器,然后服务器再使用web套接字和广播方法将消息广播到其他活动浏览器?(也许我遗漏了什么)

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


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

但是在RabbiMQ中,您总是将消息发布到
交换
,并使用
队列
使用消息

要“广播该消息”,您需要使用它

希望它能帮助你

简单的回答

对于一个简单的聊天应用程序,您不需要队列(例如,signalr在没有队列的情况下也可以这样做)

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


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

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

除非你的聊天室根本不关心历史——我想大多数人都关心历史——否则像RMQ这样的消息队列就没有多大意义

你最好为每个用户保留一个标记,让他们说出他们最后看到的消息

现在,您可能需要类似RMQ的东西来简化聊天应用程序的过程。例如,您可以从web服务器上卸载进程,并通过RMQ将所有消息推送到一个后端服务,该服务更新数据库和缓存层

这将允许您更快地扩展前端web服务器,并支持每个web服务器上更多的用户。这听起来像是RMQ的一个很好的用途,但并不特定于聊天应用。这只是扩展web应用程序/系统的良好实践


根据我的经验,关键是RMQ不负责将消息传递给用户/聊天室。这是通过WebSocket或类似的技术实现的,这些技术是为每个用户设计的。

由于过去几年中消息传递领域发生了迅速的变化,我可能会迟到。像WhatsApp这样的应用程序不在其数据库中存储消息,还提供E2E加密。
谈到RabbitMQ,它们支持MQTT协议,这是低延迟高可扩展性应用程序的理想选择。因此,使用此类排队服务可以减轻服务器的繁重工作,并提供可扩展性和安全性等功能。

基本上RabbitMQ在实时应用程序中有帮助,因为接收请求的主服务器可以将请求发送到RMQ,然后RMQ可以将其发送到多方。优化的事实是,主服务器只向RMQ发出一个请求,然后可以自由地接受其他客户端。(以这种方式,他不负责更新所有各方)这是否正确?
// 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 
});