gpt4 book ai didi

tomcat - 聊天服务器负载平衡

转载 作者:行者123 更新时间:2023-11-28 21:49:42 25 4
gpt4 key购买 nike

我读过 the document on clustering and load balancing来自用于 Tomcat 服务器的 Apache,但我对它如何用于通信感到困惑。

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

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

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

最佳答案

您实际上是在查看两个不同的要求:

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

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

第二个要求是问题。

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

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

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

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

明确的优化是支持一种将具有事件对话的用户移动到同一服务器的机制,但这不适用于大多数负载平衡机制。应该有某种方法可以强制用户在特定服务器之间建立亲和性,但我想不出一个简单的方法。

关于tomcat - 聊天服务器负载平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15832147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com