Java分布式计算。最佳方案是什么?

3
我正在开发一个系统,可以简单地描述如下:
  1. 有多个服务器,每个服务器都运行相同的Java应用程序(为了可扩展性)。
  2. 有一个共同的数据库服务器,每个应用程序服务器都与之通信。
  3. 数百万客户端,每个客户端连接到一个随机服务器。每个客户端与一个服务器具有一个打开的套接字。
现在假设,客户端A连接到服务器A,想向客户端B发送消息。
这种问题的最佳方法是什么?最好的方式是如何跟踪哪个客户端连接到哪个服务器,并且如何使服务器彼此通信。
这是一个Java特定的问题。如果只有一个服务器,可以通过线程间通信来完成。但问题是多个服务器。此外,是否有任何开源库可以使这项任务更容易?

一种方法是将客户端连接到哪个服务器存储在共同的数据库中,还会存储客户端套接字的进程ID和线程ID,然后使用RMI发送消息。但是是否有更高效的解决方案呢? - Tarandeep Gill
我也对这个问题很感兴趣。我可以使用ActiveMQ来实现这个功能,通过主题将消息发送到所有服务器,然后在每个服务器上检查是否有针对他的消息(通过ID接收者)? - komelgman
4
为什么不让客户连接到一个特定的服务器,而是连接到一个由哈希函数(例如,他们的IP地址)确定的服务器,而不是随机服务器呢? - Kru
我还没有决定那个策略,但无论如何我仍然需要进行服务器间通信。 - Tarandeep Gill
2个回答

3

您的服务器需要能够查找客户端的位置(可能通过数据库,也可能通过专用地址服务器),或者您需要使用哈希方法或其他非随机分区方法来消除随机性,正如评论中Kru所建议的那样。 (无论哪种方式,如果服务器出现故障,您都会遇到问题,但这可能超出了您的问题范围)。

然后,您的服务器需要能够将消息转发到适当的其他服务器。最简单的方法是它们彼此维护套接字连接。

另一种方法是使用消息队列系统。您可以考虑使用高性能的无代理系统,例如ZeroMQ,它提供类似于套接字的API,但具有更高的吞吐量和容错性,以及更丰富的消息模式。更高级别的消息产品可能已经实现了您描述的大部分系统(处理可扩展性、寻址等)。

您可能能够使用现有协议(如XMPP)而不是发明自己的分布式消息传递系统。


0
我相信你正在寻找一个分布式哈希表。你可以使用Chord协议,并将IP的哈希作为键。使用这个键,协议将能够路由到包含该键的适当服务器(维护与客户端B的连接的服务器)。 你还可以查看现有的Java实现DHT的例子,比如http://tomp2p.net/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接