Scala 参与者和共享状态

标签 scala shared-memory actor akka

我正在尝试实现一个调度程序参与者,它要么处理请求,要么在失败的情况下将处理委托(delegate)给另一个参与者(实际上它是指数退避算法)。调度程序参与者有一个 bool 变量,用于决定如何路由处理。

保持 Actor 的某种状态是否正确?可能会出现什么问题?我应该使用交易者 (akka) 还是 STM 来避免出现问题? (我使用的是akka actor)

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
   } 
}

最佳答案

Actor 应该维护状态,但如果它们仅响应消息或内部生成的操作而更改状态,那么最容易推理它们;如果其他实体希望它们改变状态,它们应该发送消息。

对于你的情况,我会改变

def otherMethod { backoff = true }

到,在接收内,

case BeginBackoff => backoff = true

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

关于Scala 参与者和共享状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4981352/

相关文章:

c++ - 为什么我可以使用 POSIX 创建一个比安装在/dev/shm 上的大小更大的共享内存?

java - 如何在libGDX中显示图片?

Android等宽字体大小

scala - groupBy 方法在 Slick 中抛出错误

Windows 上的 C++ 命名共享内存,SSD 与 HDD

scala - 在参与者系统中隐式传递请求上下文

model - 使用 zeromq 实现actor模型

scala - StringTokenizer 到 Scala 迭代器

java - 从 Spark 2.0 中的逗号分隔字符串行中获取不同的项目

cuda - CUDA 共享内存中的并行扫描