Вопрос

В настоящее время я разрабатываю приложение для хранения таблиц Azure. В этом приложении у меня есть таблица, которая будет иметь относительно мало вставки (пара тысяч/день), и основной ключ этих сущностей будет использоваться в другой таблице, в которой будут миллиарды строк.

Поэтому я ищу способ использования целочисленного автоматического интеграции, а не GUID, в качестве первичного ключа в маленькой таблице (поскольку оно сэкономит много хранилища, а масштабируемость вставок на самом деле не является проблемой).

Были некоторые дискуссии по этой теме, например, на http://social.msdn.microsoft.com/forums/en/windowsazure/thread/6b7d1ece-301b-44f1-85ab-eeb274349797.

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

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

Решение

Я еще не реализовал это, но работаю над этим ...

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

Вы должны сохранить таблицу, чтобы содержать значение самого большого числа, добавленного в очередь. Если вы знаете, что не будете использовать тонну целых чисел, у вас может быть работника так часто проснуться и убедиться, что в очереди все еще есть целые числа. У вас также может быть использованная int queue, которую работник мог бы проверить, чтобы следить за использованием.

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

Если этот вызов потерпел неудачу, вам понадобится способ (скажите работнику, что вы собираетесь выполнить работу для них (Lock), тогда работники работают над получением следующего идентификатора и разблокируются)

  1. замок
  2. Получите последний ключ, созданный из таблицы
  3. Приращение и сохранение
  4. разблокировать

Затем используйте новое значение.

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

Для всех, кто найдет его в поиске, есть лучшее решение. Минимальное время для блокировки таблицы составляет 15 секунд - это ужасно. Не используйте его, если вы хотите создать действительно масштабируемое решение. Использовать Etag!

Создайте один объект в таблице для ID (вы даже можете назвать его как идентификатор или что -то еще).

1) Прочитайте это.

2) Приращение.

3) INSERTORUPDATE С ETag Указано (из запроса чтения).

Если последняя операция (InsertOrUpdate) добивается успеха, тогда у вас есть новый, уникальный, автоматическое идентификатор. Если это не удастся (исключение с HttpStatusCode == 412), это означает, что какой -то другой клиент изменил его. Итак, повторите еще раз 1,2 и 3. обычное время для Read+InsertOrUpdate меньше чем 200 мс. Анкет Моя тестовая утилита с источником на GitHub.

Видеть Уникальный класс Джош Твист.

Решение, которое я обнаружил, которое предотвращает дублирующиеся идентификаторы и позволяет автоинскруте его

  1. Замок (аренда) капля И пусть это действует как логические ворота.

  2. Затем прочитайте значение.

  3. Напишите увеличенное значение

  4. Выпустить договор аренды

  5. Используйте значение в вашем приложении/таблице

Тогда, если бы ваша рабочая роль была сбоя в течение этого процесса, у вас будет только отсутствующий удостоверение личности в вашем магазине. ИМХО, что лучше дубликатов.

Вот Пример кода и дополнительная информация При этом подходе от Стива Маркса

Если вам действительно нужно избегать ГИД, рассматривали ли вы что -то в зависимости от даты/времени, а затем использовать ключи раздела, чтобы минимизировать риск параллелизма.

Ваша ключ раздела может быть пользователем, год, месяцем, днем, часом и т. Д., А ключом строки может быть остальная часть DateTime на достаточно небольшом временном пространстве для контроля параллелизма.

Конечно, вы должны спросить себя по цене даты в Azure, если предотвращение GUID действительно стоит всех этих дополнительных усилий (при условии, что GUID будет работать).

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