使用与 10 万个参与者共享的并发哈希图是否安全?

Bla*_*man 3 scala akka

我有大约 10 万个产品要保存在内存中。这些产品每小时可能会以很高的速度变化,但同时读取将是大部分调用,并且获取最新版本可能会有延迟。

我想为每个产品创建 1 个演员,但有一个共享的产品内存存储。

使用并发哈希图并将其作为道具传递给 100K 演员是否安全?

val products = new ConcurrentHashMap[ProductId, Product](initialCapacity)
Run Code Online (Sandbox Code Playgroud)

所以在我的演员中,我会有类似的东西:

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

有更新时,每小时可能有 100-500K。更新可能会有延迟,这不是问题。因此,为了分发更新并防止锁定,我正在考虑每个产品 1 个参与者。我只想让缓存在所有参与者中都是全局的。

这个设计合理吗?

Rol*_*uhn 9

ConcurrentHashMap 可以安全地共享,线程数无关紧要。但是,当您将状态保留在其他地方时,为什么还要创建 10 万个演员?Actor 的存在是因为它拥有自己的状态;如果不是这种情况,则 Actor 不应该存在。

因此,要么将数据保存在 ConcurrentHashMap 中,要么只需要与 CPU 内核数量相同的线程(actor)即可进行访问。或者您放弃 CHM 并将您的每个产品存储在其自己指定的 Actor 中。该决定取决于您要执行的操作的性质:如果您只想一次只与一个产品交互,那么 Actor 是一种很好的建模方式。如果您想一次与一组产品进行交互,请使用其他东西。