聊天服务器负载均衡

4
我已经阅读了Apache针对Tomcat服务器的集群和负载平衡文档(链接),但是我对通信如何工作感到困惑。
假设我正在创建一个聊天应用程序,允许用户通过服务器彼此交谈。如果两个用户在同一台服务器上,那很好,但是如果一个用户在一台服务器上,另一个用户在另一台服务器上,服务器将如何进行通信?
我想说的是,我将使用多个服务器来减少负载,但是如果用户通过服务器进行通信,并且每个用户都在单独的服务器上,则我的两个服务器将成为彼此的客户端,负载不会减少。
我的观点是每个服务器进出相同数量的数据,那么当有100万用户时,这如何工作?

我也在寻找类似的东西。聊天服务器需要共享在线状态和负载均衡,就像我们用于网页的那样是不够的。是否有任何聊天/在线状态服务器集群的框架? - Chinta
2个回答

4

你实际上需要考虑两个不同的需求:

  1. 负载均衡:为多个Web(或其他协议)服务器公开单个网络地址。
  2. 在多个服务器之间传递状态(消息)。

第一个需求很简单:使用硬件或软件负载平衡器,或者在多个Java服务器前面使用单个Apache Web服务器。

第二个需求是个问题。

让我们想象一下单个系统上的虚构聊天服务器。当收到消息时,请求会被解析,新消息将被放置在接收者的内存中。还需要处理常见情况:例如用户在会话中间退出登录。您还需要想出如何将接收到的消息传递回用户的浏览器。浏览器可以轮询(“向我发送用户X后的所有消息”),或者服务器可以使用多种技术推送接收到的消息。如果您在Web服务器上运行聊天服务器,则应该对此非常熟悉。

困难的部分是:如何在多台机器上完成这项工作?我能想到几种可扩展的方法:

  • 跟踪接收者所在的服务器。使用另一种传输机制将消息发送到该服务器,以便将其像本地发送方一样放入内存中。请参阅“消息队列”或“企业服务总线”。
  • 将消息处理与通信分离:为活动对话指定一个或多个服务器。接收方服务器向这些服务器发送消息;使用通知机制(好)或轮询(不太好)来提醒接收方服务器有待发送的聊天消息。特别功能:使用分布式哈希表将消息邮箱分发到服务器池中;如果一个或多个服务器失败,DHT可以自动调整。
  • 使用广播:如果接收者不在本地,则每个服务器都向所有其他服务器广播。每个服务器都会收到通知;只有具有接收者的服务器才会对其进行处理。

关键在于您不能再在多台计算机之间使用共享内存。您必须使用几种可能的机制之一来移动服务器之间的消息。您不太可能使用通用、相对高开销的协议(例如HTTP)来完成此操作;有许多更有效的工具可供选择,并且您可以实现多个抽象级别,从使用像Terracotta这样的共享缓存工具,到使用像JXTA这样的点对点网络协议,再到使用像ActiveMQ这样的企业服务总线等。根据您想要在用户的浏览器上运行多少内容,甚至可以直接在客户端系统上运行一些消息队列软件 - 新消息的通知可以直接发送到用户而不是中间邮箱。

明显的优化是支持将具有活动对话的用户移动到同一服务器的机制,但这在大多数负载平衡机制下无法实现。应该有一种方法来强制某个用户的特定服务器之间的亲和关系,但我想不出一个简单的方法。


0

您可以使用负载均衡器来实现您所需的功能。

基本上,服务器负载均衡器可以是:

  • 传输层负载均衡器 - 基于 DNS 或 TCP/IP 级别的负载均衡
  • 应用层负载均衡器 - 使用应用程序有效负载来进行负载平衡决策。

基本的服务器负载均衡器如下所示:

enter image description here

基本上,每个服务器都会向负载均衡器报告其当前连接数。负载均衡器使用此信息来决定将新客户端发送到哪个服务器。

我的观点是,当有100万用户时,每个服务器的数据量是相同的吗?

实际上,如果您考虑到您不需要向每个客户端广播每个信息,则数据量并不相同,您可以动态优化此过程并显著减轻负载。

有关Tomcat实现的更多详细信息,请参阅以下链接:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接