【发布时间】:2018-10-06 10:12:23
【问题描述】:
Akka actor 基于 off-fire and forget 机制来交换消息,我如何配置 Akka 以保证将消息传递给另一个 actor?
【问题讨论】:
标签: akka
Akka actor 基于 off-fire and forget 机制来交换消息,我如何配置 Akka 以保证将消息传递给另一个 actor?
【问题讨论】:
标签: akka
普通的Akka actor,根据其设计原则,不保证message delivery。但是,如果您使用其PersistentActor,Akka 确实提供了至少一次交付选项。
至少一次交付本质上确保持久的发送方参与者将继续以可配置的频率向接收方发送消息,直到它收到来自接收方的确认(或来自某些用于取消正在进行的交付尝试的终止例程)。
通过至少一次传递,持久消息将被重新发送,直到收到确认。 Akka 提供deliver 方法来发送每条带有连续单调递增deliveryId 标记的消息,并在收到来自接收方的相应deliveryId 的确认后,使用confirmDelivery 方法表示消息已成功传递。
以下 Scala sn-p 是来自 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 的事件,以实现一致的状态恢复。
【讨论】: