假设我正在创建一个聊天应用程序,允许用户通过服务器彼此交谈。如果两个用户在同一台服务器上,那很好,但是如果一个用户在一台服务器上,另一个用户在另一台服务器上,服务器将如何进行通信?
我想说的是,我将使用多个服务器来减少负载,但是如果用户通过服务器进行通信,并且每个用户都在单独的服务器上,则我的两个服务器将成为彼此的客户端,负载不会减少。
我的观点是每个服务器进出相同数量的数据,那么当有100万用户时,这如何工作?
你实际上需要考虑两个不同的需求:
第一个需求很简单:使用硬件或软件负载平衡器,或者在多个Java服务器前面使用单个Apache Web服务器。
第二个需求是个问题。
让我们想象一下单个系统上的虚构聊天服务器。当收到消息时,请求会被解析,新消息将被放置在接收者的内存中。还需要处理常见情况:例如用户在会话中间退出登录。您还需要想出如何将接收到的消息传递回用户的浏览器。浏览器可以轮询(“向我发送用户X后的所有消息”),或者服务器可以使用多种技术推送接收到的消息。如果您在Web服务器上运行聊天服务器,则应该对此非常熟悉。
困难的部分是:如何在多台机器上完成这项工作?我能想到几种可扩展的方法:
关键在于您不能再在多台计算机之间使用共享内存。您必须使用几种可能的机制之一来移动服务器之间的消息。您不太可能使用通用、相对高开销的协议(例如HTTP)来完成此操作;有许多更有效的工具可供选择,并且您可以实现多个抽象级别,从使用像Terracotta这样的共享缓存工具,到使用像JXTA这样的点对点网络协议,再到使用像ActiveMQ这样的企业服务总线等。根据您想要在用户的浏览器上运行多少内容,甚至可以直接在客户端系统上运行一些消息队列软件 - 新消息的通知可以直接发送到用户而不是中间邮箱。
明显的优化是支持将具有活动对话的用户移动到同一服务器的机制,但这在大多数负载平衡机制下无法实现。应该有一种方法来强制某个用户的特定服务器之间的亲和关系,但我想不出一个简单的方法。
您可以使用负载均衡器来实现您所需的功能。
基本上,服务器负载均衡器可以是:
基本的服务器负载均衡器如下所示:
基本上,每个服务器都会向负载均衡器报告其当前连接数。负载均衡器使用此信息来决定将新客户端发送到哪个服务器。
我的观点是,当有100万用户时,每个服务器的数据量是相同的吗?
实际上,如果您考虑到您不需要向每个客户端广播每个信息,则数据量并不相同,您可以动态优化此过程并显著减轻负载。
有关Tomcat实现的更多详细信息,请参阅以下链接: