2

我正在尝试实现一个调度程序参与者,它要么处理请求,要么在发生故障时将处理委托给另一个参与者(实际上它是指数退避算法)。调度员参与者有一个布尔变量,用于决定如何路由处理。

在演员中保持某种状态是否正确?可能会出现什么问题?我应该使用交易者(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
   } 
}
4

1 回答 1

4

Actors 应该保持状态,但如果他们只更改状态以响应消息或其内部生成的操作,则最容易对其进行推理;如果其他实体希望他们改变状态,他们应该发送消息。

在你的情况下,我会改变

def otherMethod { backoff = true }

到, 在接收中,

case BeginBackoff => backoff = true

并让要调用 otherMethod 的人改为发送BeginBackoff。(如果您需要优先处理退避消息,您应该使用两级接收其他人已经演示过,例如回答您之前关于演员的问题。)

于 2011-02-12T23:50:54.483 回答