Подтвердить что ты не робот

Синглтон в среде кластеров

Какова наилучшая стратегия реорганизации объекта Singleton в среду кластера?

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

Теперь наше приложение нужно развернуть в кластерной среде. По определению, каждый JVM будет иметь свой собственный экземпляр Singleton. Таким образом, кеш может быть не синхронизирован между JVM, когда событие обновления происходит на одном node, и его кеш обновляется.

Как лучше синхронизировать кеш?

Спасибо.

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

4b9b3361

Ответ 1

Простейшие подходы:

  • Добавьте таймер истечения срока действия в кеш-кеш-кеш-кеш, чтобы каждый так часто очищался кеш и подсыщенные вызовы извлекали обновленные данные из источника (например, базы данных)

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

Ответ 2

Замените кеш-кеш-кеш с распределенным кешем.

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

Для одноэлементных объектов в целом я не уверен. Я думаю, что я постараюсь не иметь в первую очередь синглов.

Ответ 3

Вы можете использовать DistributedMap, встроенный в WAS.

-Rick

Ответ 4

Или что-то вроде memcached

http://www.danga.com/memcached/

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

Danga Interactive разработал memcached для повышения скорости LiveJournal.com, сайт, который был уже делает 20 миллионов + динамическая страница просмотров в день для 1 миллиона пользователей с кучу веб-серверов и кучу серверы баз данных. memcached упал загрузка базы данных почти ничего, обеспечивая более быстрое время загрузки страницы для пользователей, более эффективное использование ресурсов, и более быстрый доступ к базам данных на промаха memcache.

Ответ 5

Если возможно, используйте поддержку вашего сервера приложений для этого, если это возможно (некоторые из них есть, а некоторые нет). Например, мы используем поддержку JBoss для "HA Singleton", которая является службой, которая выполняется только на главном кластере node. Это не идеально (вы должны справиться с тем случаем, когда время от времени его мозг пукает), но он достаточно хорош.

В противном случае вы можете что-то создать с помощью JGroups, которая обеспечивает автоматическое обнаружение и согласование кластера node, но это нетривиально.

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

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

Ответ 6

Я с мистером Вест Хэнсеном на этом, двигаюсь как можно дальше от синглтонов. После того, как меня превзошли кошмар, который является SAAJ и JAXP, и получив совместимые версии, работающие над JBoss, я покончил с одиночками и фабриками. Для создания SOAP-сообщения не требуется factory.

Хорошо, рассердился, что с memcache или что-то подобное? Какая связь вам нужна для вашего кеша? Это плохо, если оно ВСЕГО устарело или существует некоторая гибкость в том, как устаревшие данные могут получить?

Ответ 7

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

Если вам нужны только данные, которые разумно подходят к данным, но для каждой JVM не обязательно иметь соответствующие данные, вы можете просто обновить все данные jvm в одном и том же расписании (например, каждые 30 секунд).

Если обновление должно произойти примерно в одно и то же время, вы можете отправить одному jvm сообщение всем остальным, сказав "время его обновления"

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

Ответ 8

Я столкнулся с аналогичной ситуацией, но я использую Oracle WebLogic и Coherence.

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

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

Ответ 9

Есть продукты для распределения в кэше памяти (например, memcache), которые могут помочь в этой ситуации.

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