我有一个应用程序服务器。在较高级别上,此应用程序服务器具有用户和组。用户是一个或多个组的一部分,服务器使所有用户都知道他们的组和他们组中的其他用户的状态。主要有以下三个功能:
- 更新和广播与用户及其群组相关的元数据;例如,用户登录,服务器会更新该用户的状态并将其广播给该用户组中的所有在线用户。
- 充当两个或多个用户之间的代理;客户端利用点对点传输,但在两个用户无法直接相互连接的情况下,服务器将充当他们之间的代理。
- 为离线用户存储数据;如果客户端需要向不在线的用户发送一些数据,服务器会将该数据存储一段时间,然后在用户下次上线时发送。
我正在尝试修改这个应用程序以允许它分布在多个服务器上,不一定都在同一个本地网络上。但是,我要求不能破坏与旧客户端的向后兼容性;本质上,分发需要对客户端透明。
我遇到的最大问题是处理连接到服务器 A的用户进行更新的情况,该更新需要广播给服务器 B上的用户。
通过扩展,更大的问题是当服务器 A上的用户需要服务器充当他们和服务器 B上的用户之间的代理时。
我最初的想法是尝试为每个用户分配一个首选服务器,使用一些算法来考虑他们需要与哪些用户进行通信。这可以减少可能需要与其他服务器上的用户通信的用户数量。
但是,这只会最大限度地减少不同服务器上的用户需要通信的频率。我仍然有实现不同服务器上用户之间通信的问题。
我能想到的唯一解决方案是让服务器相互连接,当他们需要处理连接到不同服务器的用户时。
例如,如果我连接到服务器 A并且我需要一个代理与另一个连接到服务器 B的用户,我会要求服务器 A与该用户建立代理连接。服务器 A会看到另一个用户已连接到服务器 B,因此它将与服务器 B 建立“中继”连接。此连接只会将我的请求转发到服务器 B并将响应转发给我。
这样做的问题是它会增加带宽使用,这已经非常高了。不幸的是,我没有看到任何其他解决方案。
是否有任何众所周知或更好的解决方案来解决这个问题?分布式系统要求不同服务器上的用户之间进行通信似乎并不常见。