我们可以在基于参与者的系统中拥有全局状态吗?

时间:2020-03-02 08:01:05

标签: akka actor actor-model

actor模型的最大优点之一是消除了锁定(actor独立且串行地运行)。这是否意味着我们在actor系统中根本无法拥有任何共享/全局状态(因为访问/更新会带来锁)?

更实际地说,从这样一个系统中的多个参与者对实体(例如DB)进行更新会发生什么?

2 个答案:

答案 0 :(得分:2)

Actor模型旨在以另一种方式解决任何可变共享状态的问题-actor应该对其进行封装。因此,如果您需要在参与者之间共享某些东西,则应该是具有这种状态和协议的参与者才能使用它。如果您想从其他参与者中更新数据库,请提取一个负责此工作的参与者,并为其他参与者提供API或协议以更新数据库。或让多个参与者来处理数据库更新并在它们之间路由消息(请参阅参考资料,以获得更多详细信息:https://doc.akka.io/docs/akka/current/typed/routers.html

一般方法-考虑共享状态,即角色之间(通过ActorRef在角色之间共享),状态API作为该角色的消息。

答案 1 :(得分:1)

通常,在参与者系统中具有共享/全局状态不是一种首选的方式。与参与者一起工作时,一个非常中心的想法是不共享任何可变状态,相反,如documanetation

中所指出的,可变状态被封装在参与者内部

请勿在角色之间传递可变对象。为了确保 喜欢不可变的消息。如果演员的封装被破坏 将其易变的状态暴露在外面,您恢复了正常 Java并发具有所有缺点。

使演员成为行为和状态的容器,相互拥抱 这意味着不要在消息中常规发送行为(这可能会 使用Scala闭包诱人)。风险之一就是意外 在参与者之间共享可变状态,并且这种对参与者的侵犯 不幸的是,模型破坏了所有使编程的属性 在演员中有如此美好的体验。

此外,如果一个参与者需要了解另一个参与者的状态,它将使用不可变的消息来请求它并获得不可变的答复。Akka参与者的主要特征之一是其在线程中管理状态的能力-安全的方式并拥有共享且可变的状态,我们将侵犯此财产

通常,任何角色都可以直接执行DB读取操作(CRUD)。让一个演员对此负责,并从其他演员那里使用它。

让我知道是否有帮助!

相关问题