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

时间:2016-08-24 11:36:14

标签: socket.io rabbitmq message-queue

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

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

伪代码示例(使用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 
});

4 个答案:

答案 0 :(得分:6)

我不认为RabbitMQ应该用于个人聊天室。至少,不是在"聊天"或"房间"部分申请。

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

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

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

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

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

答案 1 :(得分:4)

简单回答......

对于一个简单的聊天应用程序,您不需要一个队列(例如,信号器可以在没有队列的情况下完成此操作)。

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

嗯,我真的不明白你在寻找...

但是在RabbiMQ中,您始终会向exchange发布消息并使用queue消费该消息。

要“广播那条消息”你需要消费它。

希望有所帮助

相关问题