【发布时间】:2011-08-03 16:29:50
【问题描述】:
我有一个应用服务器。概括地说,这个应用服务器有用户和组。用户是一个或多个组的一部分,服务器使所有用户都知道他们的组和他们组中的其他用户的状态。主要有三大功能:
- 更新和广播与用户及其群组相关的元数据;例如,用户登录,服务器会更新该用户的状态并将其广播给该用户群组中的所有在线用户。
- 充当两个或多个用户之间的代理;客户端利用点对点传输,但在两个用户无法直接相互连接的情况下,服务器将充当他们之间的代理。
- 为离线用户存储数据;如果客户端需要向不在线的用户发送一些数据,服务器会将该数据存储一段时间,然后在用户下次来时发送在线。
我正在尝试修改此应用程序以允许它分布在多个服务器上,不一定都在同一个本地网络上。但是,我要求不能破坏与旧客户端的向后兼容性;本质上,分发需要对客户端透明。
我遇到的最大问题是处理连接到服务器 A 的用户进行更新的情况,该更新需要广播给 服务器 B 上的用户。
通过扩展,更大的问题是当服务器 A 上的用户需要服务器充当他们与 服务器 B 上的用户之间的代理时。
我最初的想法是尝试为每个用户分配一个首选服务器,使用某种算法来考虑他们需要与之通信的用户。这可以减少可能需要与其他服务器上的用户进行通信的用户数量。
但是,这只会最大限度地减少不同服务器上的用户需要进行通信的频率。我仍然有实现不同服务器上用户之间通信的问题。
我能想到的唯一解决方案是让服务器相互连接,当他们需要处理连接到不同服务器的用户时。
例如,如果我连接到 服务器 A,并且我需要一个代理与另一个连接到 服务器 B 的用户,我会询问 服务器 A 用于与该用户的代理连接。 服务器 A 会看到其他用户已连接到 服务器 B,因此它将与 服务器 B 建立“中继”连接。此连接只会将我的请求转发到 服务器 B 并将响应转发给我。
这样做的问题是它会增加带宽使用,这已经非常高了。不幸的是,我没有看到任何其他解决方案。
对于这个问题是否有任何众所周知或更好的解决方案?分布式系统要求不同服务器上的用户之间进行通信似乎并不常见。
【问题讨论】:
-
服务器是用什么操作系统和语言编写的?
-
这是一个极其复杂的话题。上次我在 C++ 同步服务器中写了这样的东西真的很难,并且受到非常讨厌的竞争条件的影响。我最近在 Erlang 中写了一些非常相似的东西,并且相对容易。
-
现在的问题实际上并不是解决方案的复杂性,而是找到可能的“最佳”解决方案。
标签: c++ windows distributed application-server distributed-system