我正在尝试实现一个调度程序actor,它可以处理请求,也可以在发生故障时将处理委托给另一个actor(实际上它是指数退避算法)。调度程序actor有一个布尔变量,用于决定如何路由处理。
在演员身上保留一些州是否正确?会发生什么问题?我应该使用交易者(akka)还是STM来避免问题? (我正在使用akka演员)
class DispatcherActor extends Actor {
var backoff = false
def receive = {
case SendMessage(registrationId, message) => {
if (backoff) {
//put on the queue
backoffManagerActor ! AddMessageToQueue(message)
} else {
httpClient.sendNotificationToClient(message, this)
}
}
case BackoffCompleted => //set backoff to false
backoff = false
}
def otherMethod = {
backoff=true
}
}
答案 0 :(得分:4)
参与者应该保持状态,但如果他们只是为了响应消息或内部生成的动作而改变状态,那么最容易推理它们;如果其他实体希望他们改变状态,他们应该发送消息。
在你的情况下,我会改变
def otherMethod { backoff = true }
到,在接收中,
case BeginBackoff => backoff = true
让任何打算调用otherMethod的人发送BeginBackoff
。 (如果您需要优先处理退避消息,您应该使用其他人已经证明的两级接收,例如回应您之前关于演员的问题。)