Безопасно ли использовать concurrenthashmap, который используется совместно со 100K актерами? - PullRequest
3 голосов
/ 25 февраля 2020

У меня есть около 100 тысяч продуктов, которые я хочу сохранить в памяти. Эти продукты могут меняться с высокой скоростью в час, но в то же время чтение будет составлять большинство звонков, и может быть задержка с получением самой последней версии.

Я хочу создать 1 актера для каждого продукта, но иметь общее хранилище в памяти продукта.

Безопасно ли использовать concurrenthashmap и передавать его в качестве опоры для 100 000 актеров?

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-500K в час. В обновлении может быть задержка, это не проблема. Таким образом, чтобы распространять обновления и предотвращать блокировки, я думаю, что по 1 субъекту на продукт. Я просто хочу сделать кеш глобальным для всех актеров.

Этот дизайн звучит?

1 Ответ

9 голосов
/ 25 февраля 2020

ConcurrentHashMap безопасен для совместного использования, количество потоков не имеет значения. Но почему вы создаете 100 000 актеров, когда вы все равно держите государство в другом месте? Актер существует, потому что он владеет своим состоянием; если это не так, то субъект не должен существовать.

Так что либо вы храните свои данные в ConcurrentHashMap, но тогда вам нужно только столько потоков (субъектов), сколько у вас ядер ЦП для доступа. Или вы отказываетесь от CHM и храните каждый из ваших продуктов в своем собственном назначенном актере. Решение зависит от характера операций, которые вы хотите выполнить: если вы хотите взаимодействовать только с одним продуктом одновременно, тогда актеры - отличный способ смоделировать это. Если вы хотите взаимодействовать с коллекцией продуктов одновременно, используйте что-то еще.

...