我有一个应用服务器。在较高级别,此应用程序服务器具有用户和组。用户是一个或多个组的一部分,服务器使所有用户了解其组中的状态以及组中的其他用户。有三个主要功能:
我正在尝试修改此应用程序,以允许它分布在多个服务器上,而不必全部位于同一本地网络上。但是,我要求不能破坏与旧客户端的向后兼容性;实质上,分配需要对客户透明。
我遇到的最大问题是处理连接到服务器A 的用户的情况,进行需要在服务器B 上向用户广播的更新。
通过扩展,更大的问题是当服务器A 上的用户需要服务器充当他们与服务器B 上的用户之间的代理。
我最初的想法是尝试为每个用户分配一个首选服务器,使用一些算法来考虑他们需要与哪些用户进行通信。这可以减少可能需要与其他服务器上的用户通信的用户数量。
但是,这只会最大限度地减少不同服务器上的用户进行通信的频率。我仍然有在不同服务器上实现用户之间通信的问题。
我能想到的唯一解决方案是让服务器在需要处理连接到不同服务器的用户时相互连接。
例如,如果我已连接到服务器A 并且我需要与另一个连接到服务器B的用户的代理,我会问服务器A < / strong>用于与此用户的代理连接。 服务器A 会看到其他用户已连接到服务器B ,因此它会与服务器B 建立“中继”连接。此连接只会将我的请求转发给服务器B 以及对我的回复。
这个问题是它会增加带宽使用,这已经非常高了。不幸的是,我没有看到任何其他解决方案。
这个问题是否有任何众所周知或更好的解决方案?对于分布式系统而言,在不同服务器上的用户之间需要进行通信似乎并不常见。
答案 0 :(得分:1)
我不知道您在修改现有服务器时有多大的灵活性。很久以前我这样做的方法是让所有服务器保持TCP连接相互开放。我使用UDP广播告诉其他服务器彼此,并允许他们连接到新服务器并删除停止发送广播的服务器。
然后,每次用户连接到服务器时,服务器将TCP消息单播到它连接的所有服务器,并且所有服务器都会保留用户列表以及他们所在的服务器。
然后,如果您建议在另一台服务器上从一个用户收到另一个用户的消息,则必须将该消息转发给另一台服务器。服务器确实需要在同一个局域网上才能正常运行。
您可以在线程中运行服务器到服务器的通信,并实际模拟同一服务器上的用户。
但是,维护用户列表和发送消息很容易出现竞争条件(例如,当您将消息从一台服务器转发到另一台服务器时,用户会下降等)。
维护服务器代码是一场噩梦,这实际上不是实现可扩展服务器的最有效方式。但是,如果您必须使用旧版服务器代码库,那么您实际上没有太多选项。
如果您可以考虑使用支持远程进程和Erlang等节点的语言。
另一种方法可能是使用像RabbitMQ或ActiveMQ这样的消息队列系统,让服务器通过它们相互通信。这些系统设计为可扩展的,通常不依赖于发布/订阅机制。