Генерация UUids в среде веб-фермы - PullRequest
2 голосов
/ 20 января 2010

Я планирую использовать последовательные направляющие в качестве первичных ключей / uuids, как подробно описано в посте ниже

Каковы улучшения производительности Sequential Guid по сравнению со стандартным Guid?

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

Пожалуйста, дайте мне знать, каков ваш опыт.

Для чего бы то ни было, моя среда - ASP.NET 3.5, IIS 7 с использованием Oracle 11g. Кстати, какой тип данных я должен использовать для направляющих в Oracle? Я знаю, что у Sql Server есть «уникальный идентификатор»

Спасибо за ваш совет -Venu

Ответы [ 4 ]

1 голос
/ 04 февраля 2010

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

Мы используем код C #, показанный в посте (без изменения порядка, подробно описанного в одном изответ, что я чувствую, может улучшить производительность еще немного) в веб-фермах с 2 до 8 серверов приложений и никогда не было проблем с параллелизмом, я считаю, что функция SequentialGuid, реализованная в основных библиотеках Windows, уже заботится о создании различных руководств на разныхмашины.

При работе с базой данных, когда разные машины вставляют разные Guids, это означает, что каждый отдельный сервер приложений в веб-ферме будет записывать данные, которые будут находиться в определенных регионах базы данных (т. е. на сервере приложений).напишет guid, начиная с 12345, а другой - с guid, начинающимся с 62373), поэтому обновление индексов по-прежнему работает эффективно, поскольку разбиение страниц происходит не очень часто (или никогда).

Итак, из моего опытабез спецификацииЕсли возникает проблема, если вы используете ту же стратегию для создания Guids, которую я изложил в моем исходном сообщении, а также если вы работаете в среде веб-фермы, если вы используете правильный метод для создания Guids.

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

Что касается типа данных, мы использовали char (36), потому что нам нравится тратить много места!Не говоря уже о шутке, мы решили использовать длинный и подробный способ записи данных, потому что наличие данных в чистом формате значительно облегчает обслуживание, но вы можете использовать Oracle GUID или просто тип данных RAW (16) (онив основном то же самое) и запасные 20 байтов для каждого ряда.Чтобы упростить просмотр и редактирование данных, вы можете предоставить вашему клиенту несколько функций для кодирования и декодирования необработанных данных guid, чтобы было видно текстовое представление guid.

0 голосов
/ 20 января 2010

Гид для Oracle

0 голосов
/ 20 января 2010

Возможно, вы захотите взглянуть на то, как работает генератор Guid Comb в NHibernate. Я никогда не слышал о столкновениях.

0 голосов
/ 20 января 2010

Чтобы обеспечить наличие уникальных идентификаторов GUID, только один сервер может быть создателем указанных идентификаторов GUID.

Если память служит, Oracle не поддерживает создание «Guid for OLE» от MS, но вы должны иметь возможность сгенерировать что-то очень похожее, используя это: RAWTOHEX (SYS_GUID ())

В качестве альтернативы, у вас может быть отдельное приложение, расположенное на одном сервере, которое несет полную ответственность за генерацию идентификаторов GUID (например, вызов веб-службы, расположенной на определенном сервере, единственной целью которой является генерация и возврат идентификаторов GUID.

Наконец, GUIDS не последовательные. Даже если вы генерируете одно за другим, они не будут увеличиваться точно так же, как целое число (то есть, что последняя цифра не будет переходить из C-D за один шаг). Секвенирование требует целых чисел или некоторого другого числового типа данных.

...