Узел в кластере прекращает прослушивание соединений

У нас есть два узла с одинаковым кодом, которые используют akka.net в кластере и отправляют сообщения с использованием удаленных между ними.
Версия Akka.Net - 1.2.0, и мы используем dot-netty для транспорта. Это соответствующий раздел конфигурации:
actor { provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster" } remote { dot-netty.tcp { port = 34083 hostname = host_name } }

Два узла работают на разных серверах Windows (размещенных в службе Windows). Иногда узел прекращает прослушивание назначенного порта (проверяется с помощью netstat -an), и вся связь между ними теряется, пока я не перезапущу службу Windows.
Это вся информация, которую мы получаем в журналах (первые 2 сообщения от одного хоста и третье от другого):
60133 2017-08-11 10:09:11.993 Host1 Akka.Remote.Transport.ProtocolStateActor Error No response from remote. Handshake timed out or transport failure detector triggered. 60134 2017-08-11 10:09:12.040 Host1 Akka.Remote.ReliableDeliverySupervisor Warn Association with remote system akka.tcp://ProcesamientoActorSystem@warpacb004.nead.danet:34083 has failed; address is now gated for 5000 ms. Reason is: [Akka.Remote.EndpointDisassociatedException: Disassociated at Akka.Remote.EndpointWriter.PublishAndThrow(Exception reason, LogLevel level, Boolean needToThrow) at Akka.Actor.ReceiveActor.ExecutePartialMessageHandler(Object message, PartialAction1 partialAction) at Akka.Actor.UntypedActor.Receive(Object message) at Akka.Actor.ActorBase.AroundReceive(Receive receive, Object message) at Akka.Actor.ActorCell.ReceiveMessage(Object message) at Akka.Actor.ActorCell.AutoReceiveMessage(Envelope envelope) at Akka.Actor.ActorCell.Invoke(Envelope envelope) --- End of stack trace from previous location where exception was thrown --- at Akka.Actor.ActorCell.HandleFailed(Failed f) at Akka.Actor.ActorCell.SysMsgInvokeAll(EarliestFirstSystemMessageList messages, Int32 currentState)]
60135 2017-08-11 10:09:14.313 Host2 Akka.Remote.ReliableDeliverySupervisor Warn Association with remote system akka.tcp://ProcesamientoActorSystem@warpacb005.nead.danet:34083 has failed; address is now gated for 5000 ms. Reason is: [Akka.Remote.EndpointDisassociatedException: Disassociated at Akka.Remote.EndpointWriter.PublishAndThrow(Exception reason, LogLevel level, Boolean needToThrow) at Akka.Actor.ReceiveActor.ExecutePartialMessageHandler(Object message, PartialAction
1partAction) в Akka.Actor.ActorCell.<> C__DisplayClass112_0.b__0(объект m) в Akka.Actor.ActorBase.AroundReceive(получение, получение, объект сообщения) в Akka.Actor.ActorCell.ReceiveMessage(сообщение объекта) в Akka.Actor.ActorCell.AutoReceiveMessage(Envelope envelope) в Akka.Actor.ActorCell.Invoke(Envelope envelope)] Я думаю, что-то не получается на транспортном уровне, и точка-нетто закрывает сокет и прекращает прослушивание.
Есть ли способ предотвратить это или хотя бы сделать его менее частым? Если нет, можем ли мы подключиться к событию сбоя, чтобы снова начать слушать?

2 ответа

Решение

Мы обновили Akka до 1.2.3, и он начал работать правильно. Время от времени мы видим одни и те же ошибки в журнале, но соединение не прерывается.

Без дополнительной информации я не могу прокомментировать поведение во время выполнения в полном объеме, но сразу могу заметить, что ваше входящее соединение прослушивает localhostтаким образом, он не может принимать любые внешние соединения, адресованные этой машине.

В общем, когда дело доходит до Akka.Remote, всегда используйте IP-адрес для вашего имени хоста. Сокеты изначально не поддерживают DNS, и поэтому нам необходимо преобразовать все имена хостов обратно в их IP-форму, чтобы открыть соединение. В зависимости от конфигурации сети и оборудования внутренние имена хостов могут быть ненадежными.

Но если вы не возражаете, пожалуйста, опубликуйте полный журнал для устранения проблем с сетью, подобных этой.

Другие вопросы по тегам