Scala 路由器中的状态管理
假设我写了一个阿克卡演员Scala 路由器中的状态管理,scala,akka,actor,Scala,Akka,Actor,假设我写了一个阿克卡演员 class SomeActor extends Actor { val state = mutable.Map[String, Long]() def receive = { // Do some processing on the state } override def postStop () { println(Integer.toHexString(System.identityHashCode(state))) } }
class SomeActor extends Actor {
val state = mutable.Map[String, Long]()
def receive = { // Do some processing on the state
}
override def postStop () {
println(Integer.toHexString(System.identityHashCode(state)))
}
}
现在,如果我使用循环路由器,请进行负载平衡
actorSystem.actorOf(Props(classOf[SomeActor]).withRouter(RoundRobinRouter(nrOfInstances=10)))
在这种情况下,akka如何管理国家?在这种情况下,akka能保证安全吗
我想详细解释一下这个首先,它与
路由器
无关。路由器只将消息分发给每个参与者,10个参与者中的每个参与者都有其唯一的可变映射。把它想象成演员禁闭
假设向一个参与者发送多条消息。那么答案取决于您的实现——简言之:receive
中的代码。在Akka,一次只有一个参与者可以处理接收
。因此,即使一个参与者有10条消息等待运行,每条消息一次只接收一条,然后执行receive
。所以在一个循环中,剩下的9条消息会发生这种情况
因此,假设您的receive
实现是完全同步的。然后操作是原子的(以及内存可见性,akka保证这一点),因此状态
是线程安全的
但请说明它是否是异步的,即与future或(actor?msg)与pipeTo或某物,或执行某物的线程,后者将添加到状态
。在这种情况下,您需要同步状态
(在我看来,使用akka的全部座右铭都丢失了)。这是因为多个线程可能正在访问状态
结束回答,这取决于您对
接收的实现首先,它与路由器
无关。路由器只将消息分发给每个参与者,10个参与者中的每个参与者都有其唯一的可变映射。把它想象成演员禁闭
假设向一个参与者发送多条消息。那么答案取决于您的实现——简言之:receive
中的代码。在Akka,一次只有一个参与者可以处理接收
。因此,即使一个参与者有10条消息等待运行,每条消息一次只接收一条,然后执行receive
。所以在一个循环中,剩下的9条消息会发生这种情况
因此,假设您的receive
实现是完全同步的。然后操作是原子的(以及内存可见性,akka保证这一点),因此状态
是线程安全的
但请说明它是否是异步的,即与future或(actor?msg)与pipeTo或某物
,或执行某物的线程,后者将添加到状态
。在这种情况下,您需要同步状态
(在我看来,使用akka的全部座右铭都丢失了)。这是因为多个线程可能正在访问状态
结束回答,这取决于您执行的receive
我看到有10个actor实例,所以在循环路由器中,应该没有状态维护吗?我说得对吗here@winash对不起,我不明白。有10个actor实例,每个actor都有自己的映射。对不起,我的错误。我现在明白了,我看到有10个actor实例,所以在循环路由器中,应该没有状态维护吗?我说得对吗here@winash对不起,我不明白。有10个actor实例,每个actor都有自己的映射。对不起,我的错误。我现在明白了