Как обнаружить, что удаленный актер Scala умер? - PullRequest
8 голосов
/ 29 ноября 2010

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

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

Ответы [ 2 ]

4 голосов
/ 29 ноября 2010

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

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

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

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

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

4 голосов
/ 29 ноября 2010

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

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

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

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

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

Обратите внимание, что перед тем, как актер b вызывает ссылку, он устанавливает свой член 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)
  }
}
...