【问题标题】:In chat application how to send messages in public room in an efficient manner在聊天应用程序中如何高效地在公共房间发送消息
【发布时间】:2012-06-29 13:54:57
【问题描述】:

我正在创建一个基于服务器/客户端架构的聊天应用程序。服务器和客户端之间的通信是基于 TCP 的套接字。在这个应用程序中,我正在创建不同的公共房间。任何数量的用户都可以加入任何公共房间。

现在,当公共房间中的用户说“XYZ”为房间发送消息时,我需要将该消息传递给“XYZ”公共房间中的所有人。

问题从这里开始。假设公共房间“XYZ”中有 1000 个用户,每当用户在这个房间发送消息时,我需要在 for 循环中对应的套接字描述符上一一发送此消息以休息 999 人。

这是我知道的唯一方法,我认为这不是一个好方法,因为如果用户增加,它会严重影响系统的性能。

请通过建议我实现相同目标的有效方法来帮助我。

谢谢。

【问题讨论】:

  • TCP 就是这样工作的。您可以尝试使用广播地址的 UDP,但我认为仅此而已。
  • 你看过现有系统(例如 irc)是如何做到的吗?
  • 你为什么要这样做?如果您这样做是为了实际使用,请考虑使用现成的解决方案。如果您将此作为练习,您可能希望使用类似 redis 的东西来实现很多核心功能,至少在您用自己的东西替换它之前。

标签: c++ algorithm architecture client-server


【解决方案1】:

据我所知,这是使用流套接字(即 TCP,我建议将其用于(可靠)聊天)的唯一方法。

多播和其他仅适用于 UDP 等。

这也是(其中包括冗余等)大型 IRC 网络具有多个服务器的原因。接收用户消息的服务器只需要分发给他自己的所有用户和网络中的所有服务器,然后再分发给他们的用户。这减少了单个服务器的负载。

【讨论】:

  • @user1457812 我的意思不是在网络层广播,而是在应用层广播。我更正了我的措辞并改用分发。很抱歉对于这个误会。他们做的事情和你一样,但是分布在他们的网络中,这样每台服务器就可以减少需要向其发送消息的对等点。
  • 感谢您清除我。一个简单的问题是,当用户从客户端应用程序登录时,它会发送我的应用程序的域名。现在,如果我在域中使用 2 台服务器,那么 DNS 将根据负载平衡分配单个服务器的 IP。因此,用户可以在两台服务器中的任何一台上,但两台服务器都知道公共房间。所以很难分发消息。如果我在某些地方错了,请纠正我。
  • IRC 就是这样做的。服务器彼此认识。如果服务器 A 收到一条用户消息,它会将其分发给所有用户和服务器 B,包括目标房间 C。服务器 B 知道该消息来自服务器 A,并将其分发给房间 C 中的所有用户。跨度>
【解决方案2】:

使用发布订阅。客户端订阅聊天室,您只需将消息发布到单个实体 - 聊天室。

【讨论】:

  • 我如何使用它,因为通信是基于 TCP 的套接字。请更多地指导我。
  • 这对于解决客户端需要通过可靠连接以某种方式获知新消息的问题究竟有何帮助?
  • 你的意思是说他应该使用现成的 pub/sub 系统?
猜你喜欢
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多