akka 使用与100K参与者共享的并发hashmap安全吗?

4smxwvx5  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(120)

我有大约100 K的产品,我想保留在内存中。这些产品可以改变在一个高速率每小时,但在同一时间读取将是大多数的调用,可以有一个延迟与获得最新的版本。
我希望为每个产品创建一个参与者,但要在内存中存储共享的产品。
使用并发hashmap并将其作为道具传递给100 K演员安全吗?

val products = new ConcurrentHashMap[ProductId, Product](initialCapacity)

所以在我的演员中,我会有这样的东西:

def recieve = {
  case GetProduct(id: ProductId) =>
    // lookup in products concurrenthashmap, if not there, read from datastore and return 
    //
  case UpdateProduct(id: ProductId) => ???
}

当有更新时,每小时可能有100- 500 K。更新可能会有延迟,这不是问题。因此,为了分发更新并防止锁定,我考虑的是每个产品一个参与者。我只想使该高速缓存在所有参与者中全局化。
这个设计合理吗?

pvcm50d1

pvcm50d11#

ConcurrentHashMap可以安全地共享,线程的数量并不重要。但是,当您将状态保存在其他地方时,为什么还要创建100 k个Actor呢?Actor的存在是因为它拥有自己的状态;如果不是这种情况,那么执行元就不应该存在。
因此,要么将数据保存在ConcurrentHashMap中,但只需要与CPU内核数量相同的线程(参与者)来进行访问;要么抛弃CHM,将每个产品存储在其指定的参与者中。具体决定取决于您要执行的操作的性质:如果您希望一次只与一个产品进行交互,那么Actor是一个很好的建模方法。如果您希望一次与一组产品进行交互,那么请使用其他方法。

相关问题