我目前正在努力进行以下练习: 有一个给定的,无向的和连接的节点随机图。每个节点代表一个自己的进程,并且知道其邻居进程(节点)。每个节点只能与其邻居进程通信。 最初,每个节点都有一个随机整数值。目标是所有节点都计算该整数的中间值。 为此,我必须实现以下算法:
两个随机节点(N(1)和N(x))启动此分布式算法。他们最多选择两个邻居节点(N(2)和N(y))并向其发送变量的值。
接收节点N(2)计算接收到的中间值及其自己的变量。
接收节点N(2)将计算出的值存储为它们的当前值,并将其发送到发起方N(1)。
N(1)接收计算的值并将其存储为当前值。
N(1)和N(2)现在具有相同的整数值。
N(1)使用N(x)启动下一个计算...
N(2)最多选择另外两个邻居节点,并且过程再次开始。
如果节点参与了指定数量的计算,则该节点终止。
到目前为止,我已经在Java中使用基于事件的方法实现了这一点:每个传入的通信消息都将添加到事件队列的末尾,以确保节点不会同时执行两次计算。
因此,应始终按上述步骤执行这些步骤。
我正在使用以下事件:
“ REQUEST_CALCULATION”:节点1通过发送其当前值来向节点2请求计算。
“ ACK_CALCULATION”:节点2进行了计算,并将新值发送回节点1。
到目前为止,分布式应用程序可以正常运行,但是进程会定期陷入死锁状态:由于对事件的顺序处理,排队的事件无法执行,因为锁定的邻居未发送其结果。
我尝试通过不同方式解决此问题:
如果节点等待x秒钟才能得到结果,那么我认为是死锁,请取消当前计算并继续进行下一个排队的事件。 这种解决方法可以完成工作,但分布式计算很快终止:由于许多计算(以及在成功计算后转发给另外两个邻居的信息)丢失,所有节点都进入空闲模式。
与上面类似,但我没有完全取消该事件,而是重新启动了该事件并将其放在队列的末尾。这通常以无穷循环结束,在该循环中,一组节点之间的相同消息不断重复。
为避免2),我在排队事件的消耗上添加了一个随机延迟。尽管这样可以减少死锁的数量,但这种破解方法并不是最终的解决方案。
我猜想,死锁只是我应用程序基本概念失败的副作用。因此,我想问您一些有关如何使此分布式计算过程付诸实践的建议,无论我先前描述的实现如何。
在此先感谢您的帮助,投入和反馈。