Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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 将共享资源分配给多个节点中的一个节点的分布式算法_Java_Networking_Network Programming_Distributed Computing_Multicast - Fatal编程技术网

Java 将共享资源分配给多个节点中的一个节点的分布式算法

Java 将共享资源分配给多个节点中的一个节点的分布式算法,java,networking,network-programming,distributed-computing,multicast,Java,Networking,Network Programming,Distributed Computing,Multicast,我尝试实现一个多播通信来分配一些资源。我正在使用它,所以我有可靠的多播和FIFO排序。通过这样做,我想认识到,对于分布式解决方案,这意味着没有充当协调器的主节点 每个节点都可以启动分发,因此可能有两个或多个节点同时启动分发。当节点收到分发消息时,它将回答此问题。回答信息和发起者的信息之间没有区别。它只包含有关资源名称(例如resourceA)以及该节点是否能够处理它的信息。 当Member1启动分发时,它将发送如下消息: Member1, resourceA, OK Member2没有用于该资

我尝试实现一个多播通信来分配一些资源。我正在使用它,所以我有可靠的多播和FIFO排序。通过这样做,我想认识到,对于分布式解决方案,这意味着没有充当协调器的主节点

每个节点都可以启动分发,因此可能有两个或多个节点同时启动分发。当节点收到分发消息时,它将回答此问题。回答信息和发起者的信息之间没有区别。它只包含有关资源名称(例如resourceA)以及该节点是否能够处理它的信息。 当Member1启动分发时,它将发送如下消息:

Member1, resourceA, OK
Member2没有用于该资源的空间,并发送一条应答消息,如:

Member2, resourceA, NOT_OK
在这种情况下很容易,因为现在Member1知道他可以使用resourceA。当多个节点能够处理资源时,其他属性将决定谁获取资源(例如ID最高的成员)

我的问题是:当两个或多个节点同时启动关于同一主题(resourceA)的分发时,ta如何处理它

有人认为这样做有问题吗: Member1和Member2正在同时启动分发。此时,双方都在期待对方的回应。因为响应消息和起始消息没有区别,所以他们都认为刚刚收到的消息是应答者。因此,Member1向多播组发送起始消息,Member2向mutlicast组发送起始消息(在从Member1接收消息之前)。现在Member1从Member2接收到starter消息,并认为这就是响应


通过保证每个节点每个主题只发送一条消息(作为起始点或带有响应),我想说,即使有两个以上的节点,这样做也没有问题。

根据您的描述,可以得出以下结论:

  • 假设所有成员从一开始就在运行,系统运行后不会添加任何新成员,也不会删除任何成员
  • 所有成员都知道系统中的成员总数
如果其中一个结论不正确(或两者都不正确),那么我看不出您的算法是如何工作的,因为无法知道何时所有成员都响应了启动消息并得出哪个成员具有最高ID的结论

如果这两个结论都是正确的,那么我认为算法的功能没有问题,而且您的方法似乎有效。但是,对于失败或无响应的成员,生成的系统将很容易出错。如果一个成员没有响应起始消息,那么您可能会遇到无法决定谁将获取资源的情况,因为它可能是也可能不是那个没有响应的成员

不幸的是,很有可能其中一个成员在某个时候不会响应—尽管您没有提供任何关于正常运行时间要求的信息。为了避免仅仅因为一个成员没有响应而导致算法完全崩溃,您必须在算法中设计预防措施,例如,添加一个超时,如果一个成员没有及时响应,则从“已知成员列表”中删除该成员


但是,即使有了这种内置的容错功能,您也应该意识到,根据定义,没有某种协调主机的完全分布式解决方案将遇到难以处理的情况。例如,在分布式环境中,网络问题可能导致网络的一半看不到另一半的情况。由于没有协调大师可以得出任何最终结论,网络的两个部分都认为“他们了解世界”,并将继续做自己的事情。为了决定如何解决此问题,您必须更清楚地了解您的需求,并更好地了解可能的故障情况……

从您的描述中,可以得出以下结论:

  • 假设所有成员从一开始就在运行,系统运行后不会添加任何新成员,也不会删除任何成员
  • 所有成员都知道系统中的成员总数
如果其中一个结论不正确(或两者都不正确),那么我看不出您的算法是如何工作的,因为无法知道何时所有成员都响应了启动消息并得出哪个成员具有最高ID的结论

如果这两个结论都是正确的,那么我认为算法的功能没有问题,而且您的方法似乎有效。但是,对于失败或无响应的成员,生成的系统将很容易出错。如果一个成员没有响应起始消息,那么您可能会遇到无法决定谁将获取资源的情况,因为它可能是也可能不是那个没有响应的成员

不幸的是,很有可能其中一个成员在某个时候不会响应—尽管您没有提供任何关于正常运行时间要求的信息。为了避免仅仅因为一个成员没有响应而导致算法完全崩溃,您必须在算法中设计预防措施,例如,添加一个超时,如果一个成员没有及时响应,则从“已知成员列表”中删除该成员

但是,即使有了这种内置的容错功能,您也应该意识到,根据定义,没有某种协调主机的完全分布式解决方案将遇到难以处理的情况。例如,在分布式环境中,网络问题可能导致一半网络看不到另一半的情况