我构建了一个分布式系统,其中不同的节点可以是领导者或跟随者。在大多数用例中,我只有一个领导者和几个追随者。领导者通常在其服务器上是单一的,而追随者则在其他服务器上运行(其中一些在同一个 JVM 中)。
追随者节点永远不必相互发送消息,它们只会与领导者节点通信。目前,我使用tcpgossip协议来发现集群的成员。我的 GossipRouter 在与领导节点相同的 JVM 中运行。它实际上工作得很好,我的集群似乎足够稳定。
据我了解tcpgossip协议,每个节点都伸出 GossipRouter 并从中获取信息。所以在我的例子中,所有的追随者节点都会联系运行领导者节点的服务器。但是,当我关闭其中一个追随者节点时,我可以看到来自其他追随者节点的警告消息:
警告:thread=TransferQueueBundler、myCluster、ROCKET-21632 Fri Nov 18 10:22:11 CET 2016 org.jgroups.protocols.BaseBundler sendSingleMessage JGRP000029:ROCKET-21632:向 zeus-10187(102 字节)发送消息失败:java.net .SocketTimeoutException:连接超时,标头:VERIFY_SUSPECT:[VERIFY_SUSPECT:ARE_YOU_DEAD],TP:[cluster_name=myCluster]
警告:thread=TransferQueueBundler,myCluster,ROCKET-21632 Fri Nov 18 10:21:19 CET 2016 org.jgroups.protocols.TP sendToMembers JGRP000034:ROCKET-21632:向 zeus-10187 发送消息失败:java.net.SocketTimeoutException:connect时间到
哪里ROCKET-21632
和zeus-10187
是两个追随者。我预计追随者不会互相交谈,因为使用了 GossipRouter,但似乎并非如此。
有没有办法建立一个集群,其中一些节点永远不会相互通信?