Java的分布式计算。最好的方法?

时间:2012-02-25 08:40:47

标签: java rmi distributed

我正在开发一个系统,可以用非常简单的术语描述如下:

  1. 有多个服务器,每个服务器运行相同的Java App(用于可伸缩性)。
  2. 有一个公共数据库服务器,每个应用程序服务器都与之通信。
  3. 数百万个客户端,每个客户端连接到一个随机服务器。每个客户端都有一个带有一台服务器的开放式套接字。
  4. 现在说,客户端A已连接到服务器A,并希望向客户端B发送消息。

    解决此类问题的最佳方法是什么?什么是跟踪哪个客户端连接到哪个服务器以及如何使服务器相互通信的最佳方法。

    这是Java特有的问题。如果只有一台服务器,则可以通过线程间通信完成。但问题是多个服务器。此外,是否有任何开源库可以使这项任务更容易?

2 个答案:

答案 0 :(得分:3)

您的服务器需要能够查找客户端的位置(可能通过数据库,可能是专用的地址服务器),或者您需要使用散列方法或其他一些非随机分区来删除随机性,如 Kru 在评论中提出的建议。 (无论哪种方式,如果服务器出现问题,您都会遇到问题,但这可能超出了您的问题范围)。

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

另一种方法是使用消息排队系统。您可以考虑使用高性能无代理系统,例如ZeroMQ,它提供类似套接字的API,但具有更高的吞吐量和容错能力,以及更丰富的消息传递模式。更高级别的消息传递产品可能实现您描述的大多数系统(处理可伸缩性,寻址等)。

您可以使用现有协议,例如XMPP,而不是发明自己的分布式邮件系统。

答案 1 :(得分:0)

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