Осознает ли @Cacheable проблему "грохочущего стада"?

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

Я не смог найти доказательств того, что ehcache-весна-аннотации решает эту проблему.

Мне нужно написать обертку и использовать явный запирающий механизм?

1 ответов


короткий ответ на ваш вопрос будет "нет". Аннотации кэша предназначены для несколько общего назначения, в то время как решения таких проблем, как "грозовое стадо", специфичны для реализации.

по вашему последующему комментарию я собираюсь предположить, что вы используете Ehcache в качестве реализации. Страница, на которую вы ссылаетесь, описывает проблему, предлагает несколько решений, таких как использование BlockingCache в качестве декоратора для базового кэша. (Тот факт, что они документируют такие решения подразумевает, что Ehcache по умолчанию не обрабатывает проблему "грозового стада".)

BlockingCache кажется самым прямым решением, поэтому я бы начал с этого. Использование BlockingCache программно достаточно просто, но использование его по конфигурации требует немного больше работы с вашей стороны. Вам нужно будет написать свой собственный BlockingCacheDecoratorFactory, расширив CacheDecoratorFactory Ehcache. Как только вы это сделаете, вы можете настроить его в ehcache.xml для любого кэша, который нуждается в нем. Но сделайте так с осторожностью; превращение кэша в BlockingCache без необходимости может негативно повлиять на производительность.

скажем, вы написали свой собственный декоратор factory org.штабелер.кэш.BlockingCacheDecoratorFactory, и у вас есть кэш с именем "adImages", который вы хотите защитить от проблемы "грозового стада". Ваш новый ehcache.запись xml может выглядеть так:

<cache name="adImages"
           maxElementsInMemory="5000"
           eternal="false"
           timeToIdleSeconds="1800"
           timeToLiveSeconds="3600"
           overflowToDisk="false">
  <cacheDecoratorFactory class="org.stacker.cache.BlockingCacheDecoratorFactory" />
</cache>

проверьте руководство пользователя вhttp://ehcache.org/documentation/user-guide/cache-decorators читать о декораторы кэша в Ehcache. Надеюсь, это поможет.