2017-02-20 23 views
0

У меня есть «главный» актер, создающий множество дочерних актеров.Как делиться данными между участниками, которые должны быть кэшированы

Детские актеры выполняют работу, и всем им необходим доступ к данным, которые я должен извлечь из базы данных.

Я хочу, чтобы кешировать эти данные, потому что это будет очень ресурсоемким для каждого актера, который будет бить базу данных для этих данных, и это не так часто изменяется (у меня уже есть хорошая стратегия для недействительности кэша).

Например, мой ребенок актер будет нуждаться:

  1. Счет
  2. Пользователь
  3. т.д.

Эти объекты должны быть загружены из базы данных.

Как я могу загрузить эти объекты и как-то поделиться ими со всеми моими другими актерами?

Будет ли лучший способ создать общий класс с ссылкой на кэш-память guava?

Примечание Я не хочу распределенный кеш, я думаю, что в кеше в памяти будет достаточно.

ответ

1

Существуют в основном два подхода:

  1. Дайте каждому актеру ссылку на кэш (данный кэш является поточно-)

  2. Создание большего числа участников, которые облегчают доступ к кэшу.

Подход 1 является простым, но вызывает актер блокировать всякий раз, когда происходит кэш-промах, поэтому он не может обрабатывать другие сообщений до загрузки кэша или вычисляет требуемое значение.

Подход 2 требует больше актеров, но дает вам большую гибкость. Однако, если вы добавляете еще одного актера для доступа к кешу, вы создаете еще одно узкое место. Затем кэш-мисс блокирует всех других участников, которые обращаются к кешу. Вы бы предпочли иметь несколько актеров для этой цели, чтобы вы могли: а) действительно получить доступ к кешу одновременно, b) не блокировать конкретного актера, зависящего от кеша, когда происходит промахи в кеше.

+0

для подхода № 1, я всегда могу добавить данные в кеш, прежде чем отправлять работу дочернему актору, поэтому он всегда будет присутствовать. – Blankman

+0

Вы имеете в виду, когда вы создаете экземпляр актера, вы даете ему ссылку на объект кеша, содержащий все данные, которые ему когда-либо понадобятся? Итак, ваш актер никогда не будет запрашивать что-то из кеша, который еще не кэширован? Я думаю, что тогда я бы не назвал его кешем. – lex82