C # параллельное приложение - уникальные пользовательские идентификаторы - PullRequest
0 голосов
/ 05 мая 2018

Я работаю над приложением ASP.Net, которое само по себе не является распределенным приложением, но в какой-то момент все его данные будут синхронизированы с главным узлом.

Для того, чтобы иметь возможность хранить данные из разных узлов в одной уникальной таблице без проверки идентификаторов был применен подход:

  • I. Не использовать автоматически сгенерированные идентификаторы
  • II. Идентификатор строки будет составлен путем объединения NodeId + NextRowtId

NextRowId генерируется:

  1. Выбор наибольшего идентификатора из одного определенного узла,
  2. Разделение его на 2 части, первая из которых NodeId , а вторая LastDocumentId
  3. Увеличение LastDocumentId
  4. Объединить NodeId с увеличенным LastDocumentId

Например
Id = 20099, разделенный на ( NodeId = 200, LastDocumentId = 99)

LastDocumentId + 1 = 100

NextRowId = 200100

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

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

Id colision in case of concurrent use

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

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

1 Ответ

0 голосов
/ 05 мая 2018

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

Вы, вероятно, хотите использовать Guids вместо.

Тем не менее, если вам нужно знать, с каким узлом ваши данные связаны, вы должны смоделировать свою базу данных в соответствии с ней: иметь 2 столбца NodeId и DocumentId , Вы также можете создать уникальное ограничение над несколькими столбцами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...