聊天服务器负载平衡

时间:2013-04-05 10:58:51

标签: tomcat load-balancing throttling

我从Apache为Tomcat服务器阅读the document on clustering and load balancing,但我对如何进行通信感到困惑。

假设我正在创建一个聊天应用,允许用户通过服务器互相交谈。如果两个用户在同一台​​服务器上,这很好,但如果一个用户在一台服务器上而另一台用户在另一台服务器上呢?服务器如何通信?

我想我的观点是我将使用多个服务器来减少负载,但如果用户通过服务器进行通信并且每个用户都在一个单独的服务器上,那么我的两个服务器将成为彼此的客户端,并且负载不会减少

我的观点是每个服务器的数据量是相同的,所以当有100万用户时,它是如何工作的?

2 个答案:

答案 0 :(得分:2)

您真正关注两个不同的要求:

  1. 负载平衡:为多个Web(或其他协议)服务器公开单个网络地址。
  2. 在多个服务器之间传递状态(消息)。
  3. 第一个要求很简单:使用硬件或软件负载均衡器,或在多个Java服务器前使用单个Apache Web服务器。

    第二个要求是问题。

    让我们考虑单个系统上的假设聊天服务器。收到消息时,将解析请求,并将新消息放入内存中以供收件人使用。需要处理常见情况:例如,用户在会话过程中注销。您还需要弄清楚如何将收到的消息传递回用户的浏览器。浏览器可以轮询(“在用户X的#N之后向我发送所有消息”)或者服务器可以使用几种技术之一来推送所接收的消息。如果你有一个在Web服务器上运行的聊天服务器,那么这一切都应该是熟悉的。

    粘性部分是:你如何在多台机器上执行此操作?在我的头脑中,我可以想到几种可以扩展的方法:

    • 跟踪收件人所在的服务器。使用另一种传输机制将消息发送到该服务器,以便将其推送到内存中,就好像发件人是本地的一样。请参阅“消息队列”或“企业服务总线”。
    • 从通信中解耦消息处理:为活动对话指定一个或多个服务器。让收件人服务器向这些服务器发送消息;使用通知机制(好)或轮询(不太好)来提醒收件人服务器有等待发送的聊天消息。特殊功能:使用分布式哈希表将邮件邮箱分发到服务器池;如果一个或多个服务器发生故障,DHT可以自动调整。
    • 使用广播:如果收件人不是本地服务器,则每个服务器都会广播到所有其他服务器。每个服务器都收到通知;只有与收件人的人做任何事情。

    这里的关键是你不能再在多台机器之间使用共享内存。您必须使用几种可能的机制之一在服务器之间移动消息。您不太可能使用通用的,相对较高的开销协议(如HTTP);有很多优秀的工具可以提高效率,你可以在几个抽象层面实现这一点,包括使用像Terracotta这样的共享缓存工具,像JXTA这样的点对点网络协议,像ActiveMQ这样的企业服务总线等等。根据您想要放在用户浏览器上的数量,您甚至可以直接在客户端系统上运行一些消息排队软件 - 通知新消息可以直接发送给用户而不是中间邮箱。

    明确的优化是支持将具有活动对话的用户移动到同一服务器的机制,但这对大多数负载平衡机制不起作用。应该有一些方法来强制用户之间的特定服务器之间的亲和力,但我想不出一个简单的。

答案 1 :(得分:0)

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

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

  • 传输级负载均衡器 - 基于DNS的方法或TCP / IP级负载均衡
  • 应用程序级负载平衡器 - 使用应用程序有效负载来做出负载平衡决策。

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

enter image description here

基本上,每台服务器都会通知负载均衡器当前的连接数。负载均衡器使用此信息来决定发送新客户端的服务器。

  

我的观点是,每个服务器的数据量是相同的,   那么当有100万用户时,它是如何工作的?

实际上,如果您认为不需要向每个客户端广播每个信息,那么它的数据量就不一样了,您可以动态优化这些数据并显着降低负载。

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