【问题标题】:Distributed Computing with Java. Best approach?使用 Java 进行分布式计算。最好的方法?
【发布时间】:2012-02-25 08:40:46
【问题描述】:

我正在开发一个系统,可以很简单地描述如下:

  1. 有多个服务器,每个服务器运行相同的 Java 应用程序(为了可扩展性)。
  2. 有一个公共数据库服务器,每个应用程序服务器都与之通信。
  3. 数以百万计的客户端,每个都连接到一个随机服务器。每个客户端都有一个打开的套接字和一个服务器。

现在说,客户端 A 连接到服务器 A,并想向客户端 B 发送消息。

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

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

【问题讨论】:

  • 一种方法是存储在公共数据库中,哪个客户端连接到哪个服务器。以及什么进程Id和Thread Id有客户端socket,然后使用RMI发送消息。但是有没有更有效的解决方案?
  • 我也对这个问题感兴趣。我可以为此使用 ActiveMQ 并通过该主题向所有服务器发送消息,然后在每个服务器上检查消息是否发送给他(按 ID 收件人)?
  • 与其将客户端连接到随机服务器,不如让它们连接到由哈希函数确定的特定服务器,例如,它们的 IP 地址?
  • 我还没有决定那个策略,但无论如何我仍然需要进行服务器间通信。

标签: java rmi distributed


【解决方案1】:

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

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

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

您也许可以使用现有的协议,例如 XMPP,而不是发明自己的分布式消息传递系统。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      相关资源
      最近更新 更多