состояние счетчика кластеризации / репликации с областью применения - PullRequest
1 голос
/ 01 августа 2009

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

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

Ответы [ 3 ]

2 голосов
/ 01 августа 2009

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

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

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

1 голос
/ 01 августа 2009

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

Это должно удовлетворить ваше требование:

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

1 голос
/ 01 августа 2009

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

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

...