actor模型的最大优点之一是消除了锁定(actor独立且串行地运行)。这是否意味着我们在actor系统中根本无法拥有任何共享/全局状态(因为访问/更新会带来锁)?
更实际地说,从这样一个系统中的多个参与者对实体(例如DB)进行更新会发生什么?
答案 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)。让一个演员对此负责,并从其他演员那里使用它。
让我知道是否有帮助!