如何处理和更新 Actor System 中的共享哈希映射?

How to handle and updated a shared hash map in Actor System?

Hi, I have meta-data , HashMap object , need to be accessed inside my Actor class, and need to be looked up. If found key I should used it inside the Actor business logic. If not found I need to create one key and value and update the HashMap object.

So how to handle this in Actor System? as you know each actor instance would generate a not-found-key simultaneously which would result in duplicate and inconstant. So what is the industry standard to handle this scenario? Please provide your advice how to handle it.

如果我对你的理解是正确的,你的情况是你有一个哈希映射被多个参与者访问,你想知道如何在所有参与者的哈希映射中保持一致的状态。

应该有一个发布者 actor 和几个订阅者 actor。发布者持有哈希映射的规范副本。发布者首先将散列映射的副本发送给所有订阅者参与者。这些订阅者开始在哈希映射上执行业务逻辑。

当订阅者角色中的业务逻辑想要更新哈希映射时,它会向发布者角色发送消息。订阅者不会更新其本地参与者状态中的哈希映射。相反,它等待发布者发布的哈希映射。

发布者 actor 从订阅者那里接受键值对,并使用它来更新其哈希映射的规范副本。然后它将更新后的哈希映射发布给所有订阅者。

订阅者可以通过两种方式将其键值对发送给发布者。一个是异步的,另一个是同步的。第一个用告诉,第二个用问。 Tell 是轻量级的,Ask 是重量级的。 Ask 的优点是在将更新发送给发布者和接收回更新的哈希映射之间没有间隙。当然,发出请求的订阅者会收到两份更新后的哈希图:第一次是对请求的响应,第二次是发布者向所有订阅者发布哈希图时。这不会导致任何问题,因为 Akka 保证首先发送的消息将首先被接收。出于这个原因,以及哈希映射上没有发生本地更新的事实,哈希映射的第二个发布版本永远不会导致最近的写入从哈希映射中临时删除。为了安全起见,您可能希望在已发布的消息中包含一个标志,告诉订阅者演员哪个订阅者可以忽略已发布的哈希映射,因为它已经收到它作为对请求的响应。

此解决方案将保证哈希映射状态的一致性,但此同步方法可能不适合您的应用程序。订户参与者可以覆盖彼此的更改,这可能不是您想要的。为防止出现这种情况,可能需要在各个订阅者参与者中分离业务逻辑。