Узел в кластере прекращает прослушивание соединений
У нас есть два узла с одинаковым кодом, которые используют 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, PartialAction
1 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)]
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)] Я думаю, что-то не получается на транспортном уровне, и точка-нетто закрывает сокет и прекращает прослушивание.
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
Есть ли способ предотвратить это или хотя бы сделать его менее частым? Если нет, можем ли мы подключиться к событию сбоя, чтобы снова начать слушать?
2 ответа
Мы обновили Akka до 1.2.3, и он начал работать правильно. Время от времени мы видим одни и те же ошибки в журнале, но соединение не прерывается.
Без дополнительной информации я не могу прокомментировать поведение во время выполнения в полном объеме, но сразу могу заметить, что ваше входящее соединение прослушивает localhost
таким образом, он не может принимать любые внешние соединения, адресованные этой машине.
В общем, когда дело доходит до Akka.Remote, всегда используйте IP-адрес для вашего имени хоста. Сокеты изначально не поддерживают DNS, и поэтому нам необходимо преобразовать все имена хостов обратно в их IP-форму, чтобы открыть соединение. В зависимости от конфигурации сети и оборудования внутренние имена хостов могут быть ненадежными.
Но если вы не возражаете, пожалуйста, опубликуйте полный журнал для устранения проблем с сетью, подобных этой.