【发布时间】:2012-09-09 04:20:42
【问题描述】:
我尝试实现多播通信来分配一些资源。我为此使用jGroups,所以我有可靠的多播和FIFO-Ordering。通过这样做,我想意识到使用分布式解决方案,这意味着没有充当协调器的主节点。
每个节点都能够启动分发,因此有可能两个或多个节点同时启动分发。当一个节点收到一个分发消息时,它会回答这个问题。回答消息和来自初学者的消息之间没有区别。它仅包含有关资源名称(例如 resourceA)以及该节点是否能够处理它的信息。 当 Member1 开始分发时,它将发送如下消息:
Member1, resourceA, OK
Member2 没有该资源的空间并发送如下回复消息:
Member2, resourceA, NOT_OK
在这种情况下很容易,因为现在 Member1 知道他可以获取资源 A。当多个节点能够处理资源时,其他属性将决定谁获取资源(例如,具有最高 ID 的成员)。
我的问题是:当两个或多个节点同时开始关于同一主题(resourceA)的分发时,如何处理?
有没有人发现这样做有问题: Member1 和 Member2 同时开始分发。在这一点上,双方都在期待对方的回应。由于在响应消息或启动消息中没有区别这一事实,两者都认为他们刚刚收到的消息是应答者。因此 Member1 向多播组发送一个起始消息,而 Member2 向多播组发送一个起始消息(在接收到来自 Member1 的消息之前)。现在 Member1 正在接收来自 Member2 的 starter-message 并认为这是响应。
通过保证每个节点每个主题只发送一条消息(作为启动器或响应),我会说即使有两个以上的节点,这样做也没有问题。
【问题讨论】:
-
如何让这些请求和确认消息不同?它们必须相同吗?
-
通过使用不同类型的消息,我需要进行碰撞检测。因为可能会发生 Member1 开始分发 resourceA 并且同时 Member2 开始相同的分发。 Member3 向 Member1 发送应答,Member4 向 Member2 发送应答。现在 Member3 正在接收 Member2 的消息并且必须检测碰撞。之后,他必须向所有人发送中止消息。会更复杂。
标签: java networking network-programming distributed-computing multicast