состояние счетчика кластеризации / репликации с областью применения

StackOverflow https://stackoverflow.com/questions/1214738

Вопрос

Мне нужно скопировать последовательность / счетчик в кластере из восьми узлов. Это означает, что каждый http-запрос получает следующее значение в последовательности, вызывая что-то вроде getNextIntAndIncrement (), где состояние последовательности синхронизируется на всех серверах. Чтобы уточнить, это должно существовать в прикладной / глобальной области, а не в сеансе. Я знаю, это звучит как ужасная идея и, несомненно, приведет к узким местам, но это требование.

Мой вопрос: какое решение лучше? Я смотрел на сессионные компоненты с состоянием, но они, похоже, предназначены только для одного клиента. Я рассмотрел последовательность базы данных. Я также смотрел на кластер терракотовых; у них есть демонстрация последовательности http://www.terracotta.org/web / display / orgsite / Recipe? recipe = sequencer Однако я бы хотел избежать сторонних решений, если существует решение J2EE. Я использую Weblogic 8.1.

Это было полезно?

Решение

Некоторые поставщики Java EE имеют решения для кеширования с нарушением (например, WebSphere's Object Grid), и вы уже определили предложения сторонних производителей, но я не верю, что существует переносимый стандарт.

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

Если вы можете ослабить потребность в абсолютных последовательных значениях (т. е. разрешить пропуски), то вы можете разделить наборы чисел и тем самым значительно уменьшить конфликт. Если вы действительно нуждаетесь в последовательных значениях, без пропусков, то вы покупаете необходимость некоторой степени блокировки между экземплярами - вы не можете допустить второй " поток " чтобы получить новый порядковый номер, пока вы не "подтвердите" использование текущего. Если вы можете позволить себе потерять нечетный порядковый номер, то вы делаете намного лучше. Или, если вы можете независимые схемы нумерации между экземплярами, вы находитесь в гораздо лучшем положении. Например, имена ваших серверов a, b, c ... имеют идентификаторы a001, a002, b001, c001, c002 и т. Д.

Другие советы

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

Тем не менее, я бы серьезно усомнился в правильности подобных действий, но это всего лишь мои 2 цента.

У вас есть теги weblogic для этого вопроса - Weblogic разрешает кластеризовывать одиночные пакеты. например один экземпляр на кластер с поддержкой отработки отказа.

Это должно соответствовать вашему требованию.

http: // e-docs .bea.com / ВНК / docs100 / Javadocs / WebLogic / кластер / одноплодной / SingletonService.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top