Акка - как настроить, чтобы сообщение дошло до другого субъекта? - PullRequest
0 голосов
/ 25 апреля 2018

Акторы Akka основаны на механизме обмена сообщениями "забыл и забыл", как я могу настроить Akka таким образом, чтобы гарантировать гарантированную доставку сообщений другому субъекту?

1 Ответ

0 голосов
/ 26 апреля 2018

Обычные актеры Akka, по своему принципу дизайна, не гарантируют доставку сообщений .Тем не менее, Akka предоставляет вариант доставки по крайней мере один раз, если вы используете PersistentActor .

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

При доставке хотя бы один раз постоянные сообщения будут повторно отправляться до получения подтверждения.Akka предоставляет метод deliver для отправки каждого сообщения, помеченного последовательным монотонно возрастающим deliveryId, и, получив подтверждение от соответствующего deliveryId от получателя, использует метод confirmDelivery для сигнализации об успешной доставке сообщения.

В следующем фрагменте Scala, который является частью примера кода из Akka doc , выделена ключевая логика доставки по крайней мере один раз в классе субъекта-отправителя (который extends PersistentActor with AtLeastOnceDelivery):

override def receiveCommand: Receive = {
  case s: String =>
    persist(MsgSent(s))(updateState)
  case Confirm(deliveryId) =>
    persist(MsgConfirmed(deliveryId))(updateState)
}

override def receiveRecover: Receive = {
  case evt: Evt => updateState(evt)
}

def updateState(evt: Evt): Unit = evt match {
  case MsgSent(s) =>
    deliver(destination)(deliveryId => Msg(deliveryId, s))
  case MsgConfirmed(deliveryId) =>
    confirmDelivery(deliveryId)
}

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

...