Java - 分布式编程,RMI?
-
21-08-2019 - |
题
我这里遇到了一个棘手的问题。我的目标是建立一个框架来集成不同的交通模拟模型。这种集成基于模拟之间链路连接、链路成本和车辆的共享。
为了进行分布式模拟,我计划有一个“协调器”(星形拓扑)。所有参与的模拟都只需向其注册,并仅与协调器对话。然后协调器协调每次模拟之间各种任务的执行。
分布问题的一个简单示例是当一个模拟“负责”某些对象(例如道路)时。另一个则“负责”其他道路。然而,这些道路是相互连接的(因此,我们需要这些模拟之间的同步,并且需要能够远程交换数据/调用方法)。
我查看了 RMI,认为它可能适合这项任务。(抽象出必须创建有线信号规则)。
这是理智的吗?这里的问题是模拟参与者需要集中 一些 他们的数据存储在“协调器”中,以确保模拟之间的显式同步。此外,一些模拟可能需要其他模拟的组件或方法。(因此产生了使用 RMI 的想法)。
我的基本方法是让“协调器”运行一个巨大的 RMI 注册表。每次模拟都只需查找注册表中的所有内容,确保每一步都使用正确的对象。
有人对走这条路有什么建议吗?
解决方案
您可能还需要检查出 Hazelcast 。 Hazelcast是一个开源事务,分布式/分区执行队列,主题,地图,设置,列表,锁和执行服务。这是超级容易的工作;只需添加hazelcast.jar到CLASSPATH并开始编码。几乎没有配置是必需的。
如果您有兴趣以分布式的方式执行你的Runnable,可调用任务,那么请在的 http://code.google.com/docreader/#p=hazelcast
Hazelcast 是下Apache许可证和企业级支持释放也是可用的。
其他提示
这是明智的?恕我直言没有。我会告诉你为什么。但首先,我将添加的免责声明,这是一个复杂的话题,所以任何答案已被视为几乎没有划伤表面。
首先,而不是重复自己,我会指出你的的 Java的网格的总结/集群技术的,我前一段时间写的。它是一种大多完整列表。
在星型拓扑结构是“自然”的“天真”(我的意思不是说在一个糟糕的方式)实现,因为点至点很简单,关键集中控制器逻辑也很简单。然而,不容错。它引入了可扩展性问题和单一的瓶颈。它引入了通信inefficiences(即点通过中心经由两步过程通信)。
你真的想这个恐怕是一个集群(而不是数据/计算网格)解决方案,我建议你看的兵马俑。理想情况下,你想看看 Oracle Coherence的但它无疑昂贵(相比免费)。它是一个奇妙的产品虽然。
这两个产品,可以使用多种方法,但两者的核心是治疗的高速缓存等的分布式映射。你把东西,你拿东西出来,你火了该改变的缓存代码。连贯性(与我更熟悉),在这点上秤飞驰很好。这些是多个“服务器”为基础的产品,虽然为一个真正的群集。
如果你正在寻找一个更分布式模型,那么也许你应该寻找更多的基于SOA的办法。
看一看 http://www.terracotta.org/
其分布式的Java虚拟机,所以它具有被集群应用的优点看起来不超过一个标准的Java应用程序不同。
我已经在应用中使用它和速度是非常可观的那么远。
保
让您使用消息队列的方式考虑?你可以使用JMS通信/一组服务器/节点之间的协调任务和结果。你甚至可以使用Amazon的SQS(简单队列服务:aws.amazon.com/sqs),让你的服务器运行在EC2上,允许您根据需要放大和缩小
只是我的2美分。
看看JINI,它可能是一些对你有用的。
作为对其他答案的补充,据我所知,这些答案都集中在网格和云计算上,您应该注意到模拟模型有一个独特的特征:模拟时间。
当并行和同步运行分布式仿真模型时,我看到两个选项:
- 当每个仿真模型都有自己的仿真时钟和事件列表时,它们应该通过网络同步。
- 或者,可以有一个模拟时钟和事件列表,它将为所有分布式(子)模型“计时”。
第一个选项已针对高级架构 (HLA) 进行了广泛研究,例如 http://en.wikipedia.org/wiki/IEEE_1516 作为首发。
然而,第二个选项对我来说似乎更简单并且开销更少。