Локальный ehcache Grails настроен в сочетании с удаленной терракотой

В нашей среде Grails настроен ehcache, и я пытаюсь выяснить, как можно настроить локальный кеш с помощью удаленного терракотового кеша.

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

Конфиг в настоящее время довольно прост:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" >
  <diskStore path="java.io.tmpdir"/>
  <cacheManagerEventListenerFactory class="" properties=""/>
  <defaultCache
       maxElementsInMemory="20000"
       eternal="false"
       timeToLiveSeconds="12000"
       overflowToDisk="false"
       diskPersistent="false">
    <terracotta />
  </defaultCache>
  <terracottaConfig url="${com.ngs.app.tc.host}:${com.ngs.app.tc.port}" />

  <cache name="org.hibernate.cache.UpdateTimestampsCache"
      maxElementsInMemory="10000"
      timeToIdleSeconds="300"/>

  <cache name="org.hibernate.cache.StandardQueryCache"
      maxElementsInMemory="10000"
      timeToIdleSeconds="300"/>
</ehcache>

Вопросы:

  1. Учитывая приведенный выше конфиг, означает ли это, что при установке / переносе кэша всегда выполняется обратный путь к серверу терракоты?

  2. Есть ли возможная конфигурация, в которой он будет использовать локальный "горячий" кеш, прежде чем отправиться туда и обратно на сервер?

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

Спасибо за любой совет...

1 ответ

Решение

Несколько моментов:

  • Приведенная выше конфигурация только объявляет кластеризацию кэша по умолчанию, а именованные кэши не кластеризуются.
  • Ehcache работает с многоуровневой системой, что означает, что даже для кластерного кэша настройка maxElementsInMemory будет применяться к уровню кеша в кэше, локальному для каждой части JVM кластера Terracotta. Замечания: maxElementsInMemory устарела и должна быть заменена maxEntriesLocalHeap в последних версиях Ehcache.

Учитывая это, вот основные операции и их связь с кластеризованным битом кэша:

  • Получить с местным хитом: только касается уровня на куче, нет терракотового туда и обратно
  • Получить с местной мисс: пойду попробую найти значение в кластере - Терракота туда и обратно
  • Поставить: нужно будет обновить кластер - терракота туда и обратно
  • Удалить: нужно будет обновить кластер - терракота туда и обратно

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

Это означает, что ответы на ваши вопросы:

  1. См выше
  2. да
  3. Да и нет: если вам нужна только локальная часть, вы можете иметь только локальный кеш, просто опустите terracotta элемент в конфигурации кеша. Если вам нужен кластеризованный бит, но вы хотите, чтобы большинство попаданий в кэш были локальными, вам нужно настроить конфигурацию кластерного кэша.
Другие вопросы по тегам