Как узнать, что умер актер Scala remote?
в Scala актер может быть уведомлен, когда другой (удаленный) актер завершает работу, установив флаг trapExit и вызвав метод link () со вторым актером в качестве параметра. В этом случае, когда удаленный актер завершает свою работу вызовом exit (), первый уведомляется о получении сообщения о выходе.
но что происходит, когда удаленный актер завершается менее изящным способом (например, VM, где он работает, падает)? Другими словами, как местный актер может обнаружить, что удаленный больше не доступен? Конечно, я бы предпочел (если это возможно), чтобы местный актер мог быть уведомлен сообщением, подобным выходному, но это кажется невозможным. Я что-то упускаю? Должен ли я постоянно опрашивать состояние удаленного актера (и в этом случае я не знаю, какой лучший способ сделать это) или есть более умное решение?
2 ответов
но что происходит, когда удаленный актер завершается менее изящным способом (например, VM, где он работает, падает)
прокси-сервер актера остается в живых, принимая сообщения (и теряя их) и ожидая перезапуска JVM с удаленным актером. Наблюдение за сбоями JVM (и другими сбоями, происходящими на уровне инфраструктуры) выходит далеко за рамки обязанностей Scala. Хорошим выбором для этого может быть контроль через С помощью JMX.
другими словами, как местный актер может обнаружить, что удаленный больше не доступен?
Вы можете определить интервал (скажем 5000 мс). Если удаленный актер не отвечает в течение этого интервала, это знак для вас, что с удаленным актером происходит что-то неожиданное, и вы можете либо спросить его о его состоянии, либо просто считать его мертвым.
должен ли я непрерывно опрашивать состояние удаленного актера (и в этом случае я не знаю, какой лучший способ сделать это) или есть более умное решение?
вы можете поставить перед группой акторов своего рода балансировщик нагрузки опроса/диспетчер, который будет использовать только тех актеров, которые живы и готовы обрабатывать сообщения (что имеет смысл в случае удаленных актеров, которые могут внезапно появиться/исчезнуть за прокси-сервером) ->могут ли актеры Scala обрабатывать несколько сообщений одновременно?
книги актеры в Scala упоминает (не проверено лично):
уведомления о прекращении захвата.
в некоторых случаях полезно получать уведомления о прекращении в виде сообщений в почтовом ящике субъекта мониторинга.
Например, субъект мониторинга может захотеть перестроить исключение, которое не обрабатывается каким-либо связанным субъектом.
Или субъект мониторинга может захотеть отреагировать на обычное завершение, что невозможно по умолчанию.актеры могут быть настроены для получения всех уведомлений о прекращении как обычные сообщения в своем почтовом ящике с помощью
Boolean
trapExit
флаг. В следующем примере actorb
связывает себя с актером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)
}
}