为什么你需要一个消息队列来与网络套接字聊天?
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 协议,这是低延迟高可扩展性应用程序的理想选择。因此,使用此类排队服务可以减轻服务器的繁重工作,并提供可扩展性和安全性等功能。
我在互联网上看到了很多使用 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 协议,这是低延迟高可扩展性应用程序的理想选择。因此,使用此类排队服务可以减轻服务器的繁重工作,并提供可扩展性和安全性等功能。