Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-分布式编程,RMI?_Java_Distributed_Rmi_Simulation_Traffic Simulation - Fatal编程技术网

Java-分布式编程,RMI?

Java-分布式编程,RMI?,java,distributed,rmi,simulation,traffic-simulation,Java,Distributed,Rmi,Simulation,Traffic Simulation,我这里有个大问题。我的目标是建立一个框架,允许集成不同的交通仿真模型。该集成基于仿真之间链路连接性、链路成本和车辆的共享 为了进行分布式仿真,我计划有一个“协调器”(星形拓扑)。所有参与的模拟都只需向它注册,并且只与协调员交谈。然后,协调器在每个仿真之间协调各种任务的执行 分布问题的一个简单示例是,当一个模拟“负责”某些对象(如道路)时。另一个是“负责”其他道路。然而,这些道路是相互连接的(因此,我们需要在这些模拟之间进行同步,并且需要能够远程交换数据/调用方法) 我已经看过RMI,我认为它可能

我这里有个大问题。我的目标是建立一个框架,允许集成不同的交通仿真模型。该集成基于仿真之间链路连接性、链路成本和车辆的共享

为了进行分布式仿真,我计划有一个“协调器”(星形拓扑)。所有参与的模拟都只需向它注册,并且只与协调员交谈。然后,协调器在每个仿真之间协调各种任务的执行

分布问题的一个简单示例是,当一个模拟“负责”某些对象(如道路)时。另一个是“负责”其他道路。然而,这些道路是相互连接的(因此,我们需要在这些模拟之间进行同步,并且需要能够远程交换数据/调用方法)

我已经看过RMI,我认为它可能适合这个任务。(抽象出必须创建线上信号规程)

这是理智的吗?这里的问题是,模拟参与者需要将其部分数据存储集中在“协调器”中,以确保模拟之间的显式同步。此外,一些模拟可能需要其他模拟的组件或方法。(因此产生了使用RMI的想法)

我的基本方法是让“协调员”运行一个庞大的RMI注册表。而且每个模拟只需查找注册表中的所有内容,确保在每个步骤中使用正确的对象


有没有人有任何关于这条路的建议?

看看JINI,它可能对你有用。

这是否明智?不,我告诉你原因。但首先我要加上一条免责声明,这是一个复杂的话题,所以任何答案都必须被视为仅仅触及表面

首先,我不会重复我自己的话,我会给你指出我不久前写的一篇文章。这是一份基本完整的清单

星型拓扑对于“幼稚”(我不是指不好的方式)实现来说是“自然的”,因为点对点很简单,集中关键控制器逻辑也很简单。然而,它不是容错的。它引入了可伸缩性问题和单个瓶颈。这会导致通信效率低下(即各点通过中心通过两步流程进行通信)

您真正想要的可能是集群(而不是数据/计算网格)解决方案,我建议您看看。理想情况下,你可以看看,但它无疑是昂贵的(相比免费)。这是一款很棒的产品

这两种产品可以通过多种方式使用,但两者的核心都是将缓存视为分布式映射。你把东西放进去,把东西拿出来,然后发出改变缓存的代码。连贯性(我比较熟悉)在这方面的表现非常好。但对于真正的集群来说,这些产品更多的是基于“服务器”的产品


如果您考虑的是一个更为分布式的模型,那么您可能应该考虑更多基于SOA的方法。

好的,Jini,或者更具体地说,Javaspaces是一个解决问题的简单方法的好起点。Javaspaces允许您实现一个主-工作者模型,在该模型中,您的主(本例中的协调员)将任务写入Javaspace,工作者查询并处理这些任务,并将结果写回主。由于您的问题不是令人尴尬的并行问题,而且您的工作人员需要同步/交换数据,这将给您的解决方案增加一些复杂性

使用Javaspaces将为您的实现添加比使用普通RMI(Jini框架内部将其用作默认的“wire协议”)更多的抽象

请看《太阳报》的介绍

詹·纽马奇是一个很好的开始学习的地方。基尼是一个很好的选择。他们有一个map/reduce实现,具有“对拆分和聚合的直接API支持”和“分布式任务会话”。您可以浏览并查看其中的一些是否符合您的需要。

您也可以查看。Hazelcast是队列、主题、映射、集合、列表、锁和执行器服务的开源事务性、分布式/分区实现。它非常容易使用;只需将hazelcast.jar添加到类路径中并开始编码。几乎不需要配置

如果您对以分布式方式执行可运行、可调用的任务感兴趣,那么请查看以下位置的分布式执行器服务文档:


是根据Apache许可证发布的,还提供企业级支持。

您考虑过使用消息队列方法吗?您可以使用JMS在一组服务器/节点之间通信/协调任务和结果。您甚至可以使用Amazon的SQS(简单队列服务:aws.Amazon.com/SQS),让您的服务器运行在EC2上,以允许您根据需要进行上下扩展

就我的2美分。

看看

它是一个分布式Java虚拟机,因此它的优点是集群应用程序看起来与标准Java应用程序没有什么不同

我已经在应用中使用过它,到目前为止,它的速度令人印象深刻


Paul

正如我所看到的其他答案都集中在网格和云计算上一样,你应该注意到模拟模型有一个独特的特征:模拟时间

在并行和同步运行分布式仿真模型时,我看到两个选项:

  • 当每个仿真模型都有自己的仿真时钟和事件列表时,这些时钟和事件列表应通过网络同步
  • 或者,可以有一个模拟时钟和事件列表,它将为所有分布式(子)模型“计时”
对于高层体系结构(HLA),第一个选项已经被广泛研究,例如,作为一个启动程序

然而,第二个o