我使用akka群集以便在两个pahses中执行分布式计算。首先phaseA
然后phaseB
。为了处理阶段,我使用了akka的FSM。
没有硬同步,因此其中一个节点可能会到达phaseB
,而其他节点仍然在phaseA
。
问题是,phaseB
中的一个人向其他人发送了phaseB-related
条消息(它们还在phaseA
中),导致他们丢失phaseB-related
条消息。
现在我使用简单的技巧来推迟未知消息:
case any => self ! any
但IMO这不是正确的做法。我知道我也可以使用akka调度程序安排any
,但我也不喜欢这样。
以下是简化代码:
package whatever
import akka.actor._
object Test extends App {
case object PhaseA
case object PhaseB
class Any extends Actor {
def phaseA: Receive = {
case PhaseA => {
context.become(phaseB)
println("in phaseB now")
}
case any => self ! any
}
def phaseB: Receive = {
case PhaseB => println("got phaseB message !")
}
def receive = phaseA
}
val system = ActorSystem("MySystem")
val any = system.actorOf(Props(new Any), name = "any")
any ! PhaseB
any ! PhaseA
}
在这种情况下推迟邮件的正确方法是什么?
答案 0 :(得分:12)
您可以存储邮件以供日后处理。将akka.actor.Stash
混合到您的演员和stash()
phaseB
消息中以供日后使用。
当您的FSM位于phaseA
并收到phaseB
消息时,请致电stash()
。当该actor然后转换到phaseB
状态时,调用unstashAll()
并重新传递所有隐藏的消息。