Создание UUid в среде веб-фермы

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

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

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

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

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

Спасибо за совет - Вену


person user35559    schedule 20.01.2010    source источник


Ответы (4)


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

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

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

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

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

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

person massimogentilini    schedule 04.02.2010

Гид для Oracle

person SQLMenace    schedule 20.01.2010

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

person Daniel Auger    schedule 20.01.2010
comment
Я изучал это. Джимми Нильссон заявляет, что вероятность коллизии ничтожна, если вставки записей находятся на расстоянии не менее 300 мс. К сожалению, ожидаемый нами трафик намного выше этого - person user35559; 20.01.2010

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

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

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

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

person Stephen Wrighton    schedule 20.01.2010
comment
Спасибо. Если у меня есть центральный сервер для обслуживания руководств, разве это не повредит точке распространения? Я надеюсь, что есть способ обойти это - person user35559; 20.01.2010