akka постоянство, возобновление после сбоя, хотя бы один раз семантика

У меня в голове небольшой беспорядок Избегайте заражения почтового ящика http://doc.akka.io/docs/akka/2.4.2/general/supervision.html

Затем новый субъект возобновляет обработку своего почтового ящика, а это означает, что перезапуск не виден за пределами самого субъекта, за тем заметным исключением, что сообщение, во время которого произошел сбой, не обрабатывается повторно.

Мой случай: актер получает "команду" запустить что-л. Актер пытается связаться с удаленным сервисом. Сервис недоступен. Выброшено исключение. Я хочу, чтобы актер продолжал связываться с удаленным сервером. Я не хочу, чтобы актер пропустил команду ввода, которая вызвала исключение. Поможет ли Резюме заставить актера продолжать?

override val supervisorStrategy: SupervisorStrategy =
    OneForOneStrategy(maxNrOfRetries = -1, withinTimeRange = 5.minutes) {
      case _: RemoteServiceIsDownException => Resume
      case _ => Stop
    }

Под Возобновить я имею в виду повторить вызов, вызвавший возникновение исключения. Я подозреваю, что akka Resume означает сохранение экземпляра актора, но не повторение неудачного вызова

Означает ли постоянство акка надежные почтовые ящики?

Расширение первого случая. Актер пытается связаться с удаленным сервисом. Сейчас актер настойчив. SupervisorStrategy заставляет Актера продолжать связываться с удаленной службой. Вся JVM закрывается. Приложение Akka перезапускается. Сможет ли актер возобновить с того места, где он отчаянно устал, добраться до удаленного сервиса?

Означает ли постоянство akka семантику хотя бы раз?

Актер получает сообщение. Затем JVM вылетает. Получит ли родитель повторно сообщение, которое он обрабатывал во время отказа?


person Capacytron    schedule 20.04.2017    source источник
comment
Под «возобновлением» вы имеете в виду повторить вызов, вызвавший возникновение исключения? Использование Akka Persistence предоставляет вам инструменты для создания надежных почтовых ящиков, но вы не получите этого, просто расширив PersistentActor. Инструментарий ДЕЙСТВИТЕЛЬНО предлагает действительно отличную черту под названием AtleastOnceDelivery, которая помогает вам более или менее выполнить то, что вы описываете - doc.akka.io/docs/akka/current/scala/   -  person simonl    schedule 21.04.2017
comment
Под «возобновлением» вы имеете в виду повторить вызов, вызвавший возникновение исключения? - да.   -  person Capacytron    schedule 21.04.2017


Ответы (1)


Расширяю мой комментарий:

Поможет ли мне Resume заставить актера продолжать? ... Под "Возобновить" я имею в виду повторить вызов, вызвавший возникновение исключения. Я подозреваю, что akka Resume означает сохранение экземпляра актора, но не повторение неудачного вызова

Нет, не верю. Директива Resume заставит актера продолжать работать после сбоя обработки вашего сообщения. Однако один из способов повторить попытку сообщения - это просто использовать Restart и воспользоваться ловушкой preRestart Actor:

override def preRestart(t: Throwable, msgBeforeFailure: Option[Any]): Unit = {
  case t: RemoteServiceIsDownException if msgBeforeFailure.isDefined =>
     self ! msgBeforeFailure.get
  case _: =>
}

Когда актор аварийно завершает работу, он запускает эту ловушку и предлагает вам обработать сообщение, которое привело к его сбою.

Означает ли постоянство акка надежные почтовые ящики?

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

Означает ли постоянство акка семантику хотя бы раз?

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

См. http://doc.akka.io/docs/akka/current/scala/persistence.html#At-Least-Once_Delivery

person simonl    schedule 21.04.2017
comment
здорово, спасибо, я пропустил черту AtleastOnceDelivery в документе и не знал о msgBeforeFailure - person Capacytron; 21.04.2017
comment
Однако обратите внимание, что повторная отправка сообщения, которое привело к сбою / перезапуску актера, может быть опасной, если причиной сбоя было сообщение - актер просто снова выйдет из строя и повторится. - person johanandren; 26.04.2017