Проверка доступности удаленного актера Akka

Как я могу проверить, жив ли удаленный актор, для которого я получил actRef через ActorFor? Буду признательна за любую ссылку на документацию. Я использую Akka из Scala.

Я видел ссылки на супервайзеров и Deathwatch, но на самом деле не чувствую, что мой вариант использования нуждается в таком тяжелом оборудовании. Я просто хочу, чтобы мой клиент проверял, использует ли мастер известный путь, и если он отправляет сообщение, представляющее себя. Если мастер не работает, он должен немного подождать, а затем повторить попытку.

Обновление 2: есть предложения, что я просто использую пинг-понг-аск-тест, чтобы проверить, жив ли он. Я понимаю, что это что-то вроде

implicit val timeout = Timeout(5 seconds)
val future = actor ? AreYouAlive
try{
    Await.result(future, timeout.duration)
}catch{
    case e:AskTimeoutException => println("It's not there: "+e)
}

Думаю, меня смутило наличие исключений в логах, которые там и остались. Например.

  • Ошибка: java.net.ConnectException: в соединении отказано
  • Ошибка: java.nio.channels.ClosedChannelException: null

Возможно, это просто так, и я должен принять ошибки/предупреждения в журналах, а не пытаться защититься от них?


person Pengin    schedule 22.05.2012    source источник
comment
Как насчет того, чтобы просто отправить сообщение Ping актору (конечно, он должен его обработать) и некоторое время подождать Pong?   -  person Tomasz Nurkiewicz    schedule 22.05.2012
comment
Хороший вопрос, добавил обновление.   -  person Pengin    schedule 22.05.2012
comment
Нет, вы не должны ожидать, что операции tell/! вызовут исключение, поскольку обработка сообщения происходит асинхронно. Вместо этого вы должны отправить Ping и ждать Pong в течение некоторого времени. В удаленном акторе просто добавьте: case _: Ping => sender ! Pong, а в локальном: remoteActor ? Ping   -  person Tomasz Nurkiewicz    schedule 22.05.2012


Ответы (2)


Просто отправляйте ему сообщения. Его машина может стать недоступной через наносекунду после того, как вы отправите свое сообщение. ЕСЛИ вы не получили никакого ответа, скорее всего, он мертв. Об этом есть большая глава в документации: http://doc.akka.io/docs/akka/2.0.1/general/message-send-semantics.html

person Viktor Klang    schedule 22.05.2012
comment
Спасибо. Думаю, теперь я понял. Просто смущен тем, что в журнале все еще есть ошибки, но, возможно, это нормально (обновленный вопрос). - person Pengin; 23.05.2012
comment
Да, Akka регистрирует все сетевые ошибки. Вы можете подключить свой собственный регистратор, чтобы игнорировать их, если хотите. - person Viktor Klang; 23.05.2012
comment
Виктор, очень хочется прописать кастомный обработчик, скажем такой, который возвращает сообщение отправителю. Записывать огромное количество дерьма, но не давать мне знать, что произошла ошибка, — сложная схема для оценки. - person Jed Wesley-Smith; 06.06.2012
comment
Вам необходимо прочитать документацию: doc.akka .io/docs/akka/2.0.2/scala/remoting.html#Remote_Events - person Viktor Klang; 06.06.2012

Вы никогда не должны предполагать, что сеть доступна. Наш архитектор всегда говорит, что есть две ключевые концепции, которые вступают в игру при проектировании распределенных систем.

Они есть:

  • Тайм-аут
  • Повторить попытку

Сообщения должны «тайм-аут», если они не отправляются после x периода времени, а затем вы можете повторить сообщение. С тайм-аутом вам не нужно беспокоиться о конкретной ошибке - только об ошибке ответа на сообщение. Для высоких уровней доступности вы можете рассмотреть возможность использования таких инструментов, как zookeeper, для управления кластеризацией/мониторингом доступности. См., например, выборы лидера здесь: http://zookeeper.apache.org/doc/trunk/recipes.html

person JasonG    schedule 01.08.2013