Akka演员基于火灾和忘记交换消息的机制,我如何配置Akka以确保消息被传递给另一个演员?
答案 0 :(得分:1)
普通的Akka演员,根据其设计原则,不保证message delivery。但是,如果您使用PersistentActor,Akka会提供至少一次交付选项。
至少一次传送基本上确保持久发送方参与者将继续以可配置的频率向接收方发送消息,直到它从接收方接收确认(或从某些终止例程取消正在进行的传递尝试)。
在至少一次发送时,将重新发送持久消息,直到收到确认。 Akka提供方法deliver
来发送标记有连续单调递增deliveryId
的每条消息,并在收到来自接收方的相应deliveryId
的确认后,使用方法confirmDelivery
发出信号成功传递信息。
以下Scala片段是Akka doc的示例代码的一部分,突出显示发送方actor类中的至少一次传递逻辑(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
相对应的事件,以实现一致的状态恢复。