akka 我们能在基于行动者的系统中拥有全局状态吗?

nimxete2  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(101)

参与者模型的最大优点之一是消除了锁定(参与者独立且串行地操作)。这是否意味着我们在参与者系统中根本不能有任何共享/全局状态(因为访问/更新会带来锁定)?
在更实际的术语中,在这样的系统中,来自多个参与者的对实体(例如DB)的更新会发生什么?

e5nszbig

e5nszbig1#

参与者模型旨在以另一种方式解决任何可变共享状态的问题-参与者应封装它。因此,如果您需要在参与者之间共享某些内容-这应该是具有此状态和协议的参与者来使用它。如果您希望从不同的参与者更新数据库-请提取负责此操作的参与者,并为其他参与者提供API或协议以更新数据库。或者让多个参与者处理数据库更新并在它们之间路由消息(有关详细信息,请参阅:(第10页)
一般方法-考虑共享状态,作为参与者之间共享的参与者(通过ActorRef),并将状态API作为此参与者的消息。

ngynwnxp

ngynwnxp2#

通常,在参与者系统中拥有共享/全局状态不是首选的方式。使用参与者时的一个非常核心的想法是不共享任何可变状态,相反,可变状态被封装在参与者内部,如文档中所指出的
不要在参与者之间传递可变对象。为了确保这一点,最好使用不可变的消息。如果参与者的封装因将其可变状态暴露给外部而被破坏,那么您将回到具有所有缺点的正常Java并发状态。
参与者被设计成行为和状态的容器,这意味着不要在消息中发送行为(使用Scala闭包可能很诱人)。其中一个风险是在参与者之间意外地共享可变状态,不幸的是,这种对参与者模型的违反破坏了所有属性,而正是这些属性使得在参与者中编程是一种很好的体验。
此外,如果一个参与者需要知道另一个参与者的状态,它将使用不可变消息来请求它,并得到一个不可变的回复。Akka参与者的一个关键特性是他们以线程安全的方式管理状态的能力,通过共享和可变状态,我们将违反此属性
通常数据库阅读操作(CRUD)可以由任何参与者直接执行。要执行此操作,请指定一个参与者负责此操作,并从其他参与者使用它。
如果有帮助的话,让我知道!!

相关问题