我正在使用几个 akka 演员来监控我的系统,每个演员负责不同的组件。
一些actor操作不应该并行执行。所以我创建了一个持有锁的演员(LockActor)。一旦actor想要执行这样的操作,他需要请求LockActor的批准,并且在他获得批准之前他不能执行该操作。
如果我想让代码简单,在请求的演员中,我需要做类似的事情:
while (LockActor.isLockHold()) {
// perform the operation
}
这当然打破了演员系统的整体设计......
所以我需要使用使代码有点复杂的消息:
- Actor B 需要向 LockActor 发送 LockRequestMessage
- LockActor 持有持有锁请求的队列
- 如果锁定是可能的,LockActor 将 LockApprovalMessage 发送到队列中的第一个 Actor
- 当参与者 B 收到 LockApprovalMessage(不一定立即)时,他需要执行发送 LockRequestMessage 时所需的特定操作(每个参与者可以有多个需要锁定的操作)
所以我的问题是 - 在不破坏演员系统设计但仍保持代码尽可能简单的情况下实现此类事情的最佳方法是什么?