Как узнать, что умер актер Scala remote?

в Scala актер может быть уведомлен, когда другой (удаленный) актер завершает работу, установив флаг trapExit и вызвав метод link () со вторым актером в качестве параметра. В этом случае, когда удаленный актер завершает свою работу вызовом exit (), первый уведомляется о получении сообщения о выходе.

но что происходит, когда удаленный актер завершается менее изящным способом (например, VM, где он работает, падает)? Другими словами, как местный актер может обнаружить, что удаленный больше не доступен? Конечно, я бы предпочел (если это возможно), чтобы местный актер мог быть уведомлен сообщением, подобным выходному, но это кажется невозможным. Я что-то упускаю? Должен ли я постоянно опрашивать состояние удаленного актера (и в этом случае я не знаю, какой лучший способ сделать это) или есть более умное решение?

2 ответов


но что происходит, когда удаленный актер завершается менее изящным способом (например, VM, где он работает, падает)

прокси-сервер актера остается в живых, принимая сообщения (и теряя их) и ожидая перезапуска JVM с удаленным актером. Наблюдение за сбоями JVM (и другими сбоями, происходящими на уровне инфраструктуры) выходит далеко за рамки обязанностей Scala. Хорошим выбором для этого может быть контроль через С помощью JMX.

другими словами, как местный актер может обнаружить, что удаленный больше не доступен?

Вы можете определить интервал (скажем 5000 мс). Если удаленный актер не отвечает в течение этого интервала, это знак для вас, что с удаленным актером происходит что-то неожиданное, и вы можете либо спросить его о его состоянии, либо просто считать его мертвым.

должен ли я непрерывно опрашивать состояние удаленного актера (и в этом случае я не знаю, какой лучший способ сделать это) или есть более умное решение?

вы можете поставить перед группой акторов своего рода балансировщик нагрузки опроса/диспетчер, который будет использовать только тех актеров, которые живы и готовы обрабатывать сообщения (что имеет смысл в случае удаленных актеров, которые могут внезапно появиться/исчезнуть за прокси-сервером) ->могут ли актеры Scala обрабатывать несколько сообщений одновременно?


книги актеры в Scala упоминает (не проверено лично):

уведомления о прекращении захвата.

в некоторых случаях полезно получать уведомления о прекращении в виде сообщений в почтовом ящике субъекта мониторинга.
Например, субъект мониторинга может захотеть перестроить исключение, которое не обрабатывается каким-либо связанным субъектом.
Или субъект мониторинга может захотеть отреагировать на обычное завершение, что невозможно по умолчанию.

актеры могут быть настроены для получения всех уведомлений о прекращении как обычные сообщения в своем почтовом ящике с помощью Boolean trapExit флаг. В следующем примере actor b связывает себя с актером a:

val a = actor { ... }
val b = actor {
self.trapExit = true
link(a)
...
}

обратите внимание, что перед актером b вызывает link он устанавливает его trapExit члены true;
это означает, что всякий раз, когда связанный актер завершает (обычно или ненормально) его получает сообщение типа Exit.
Поэтому, актер b будет уведомлен всякий раз, когда актер a завершается (при условии, что актер a не прекращается до bвызов ссылки).

Итак, "что происходит, когда удаленный актер заканчивается менее изящным способом"?
Он должен получить Exit сообщение даже в случае аварийного завершения.

val b = actor {
  self.trapExit = true
  link(a)
  a ! 'start
  react {
    case Exit(from, reason) if from == a =>
    println("Actor 'a' terminated because of " + reason)
  }
}