Я построил распределенную систему, в которой разные узлы могут быть либо ведущими, либо ведомыми. В большинстве случаев использования у меня будет только один лидер и несколько последователей. Лидер, как правило, один на своем сервере, а последователи работают на других серверах (некоторые из них в той же JVM).
Узлы-последователи никогда не должны будут отправлять сообщения друг другу, они будут общаться только с узлами-лидерами. В настоящее время я использую протокол tcpgossip для обнаружения членов кластера. Мой GossipRouter работает на той же JVM, что и ведущий узел. На самом деле это работает очень хорошо, мой кластер кажется достаточно стабильным.
Насколько я понимаю протокол tcpgossip, каждый узел обращается к GossipRouter и получает от него информацию. Итак, в моем случае все узлы-последователи связываются с сервером, на котором работает ведущий узел. Однако, когда я отключаю один из узлов-последователей, я вижу предупреждающие сообщения от других узлов-последователей, в которых указано:
ВНИМАНИЕ: thread=TransferQueueBundler,myCluster,ROCKET-21632, пятница, 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, пятница, 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, но, похоже, это не так.
Есть ли способ построить кластер, в котором некоторые узлы никогда не будут общаться друг с другом?