Обычные актеры 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
для согласованного восстановления состояния.