我尝试实现多播通信来分配一些资源。我为此使用jGroups ,所以我有可靠的多播和 FIFO-Ordering。通过这样做,我想意识到使用分布式解决方案,这意味着没有充当协调器的主节点。
每个节点都能够启动分发,因此有可能两个或多个节点同时启动分发。当一个节点收到一个分发消息时,它会回答这个问题。回答消息和来自初学者的消息之间没有区别。它仅包含有关资源名称(例如 resourceA)以及该节点是否能够处理它的信息。当 Member1 开始分发时,它将发送如下消息:
Member1, resourceA, OK
Member2 没有该资源的空间并发送如下回复消息:
Member2, resourceA, NOT_OK
在这种情况下很容易,因为现在 Member1 知道他可以获取资源 A。当多个节点能够处理资源时,其他属性将决定谁获取资源(例如,具有最高 ID 的成员)。
我的问题是:当两个或多个节点同时开始关于同一主题(resourceA)的分发时,如何处理它?
有没有人看到这样做的一些问题:Member1 和 Member2 同时开始分发。在这一点上,双方都在期待对方的回应。由于在响应消息或启动消息中没有区别这一事实,两者都认为他们刚刚收到的消息是应答者。因此 Member1 向多播组发送一个起始消息,而 Member2 向多播组发送一个起始消息(在接收到来自 Member1 的消息之前)。现在 Member1 正在接收来自 Member2 的启动消息,并认为这是响应。
通过保证每个节点每个主题只发送一条消息(作为启动器或响应),我会说即使有两个以上的节点,这样做也没有问题。