我有大约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。更新可能会有延迟,这不是问题。因此,为了分发更新并防止锁定,我考虑的是每个产品一个参与者。我只想使该高速缓存在所有参与者中全局化。
这个设计合理吗?
1条答案
按热度按时间pvcm50d11#
ConcurrentHashMap可以安全地共享,线程的数量并不重要。但是,当您将状态保存在其他地方时,为什么还要创建100 k个Actor呢?Actor的存在是因为它拥有自己的状态;如果不是这种情况,那么执行元就不应该存在。
因此,要么将数据保存在ConcurrentHashMap中,但只需要与CPU内核数量相同的线程(参与者)来进行访问;要么抛弃CHM,将每个产品存储在其指定的参与者中。具体决定取决于您要执行的操作的性质:如果您希望一次只与一个产品进行交互,那么Actor是一个很好的建模方法。如果您希望一次与一组产品进行交互,那么请使用其他方法。