Я работаю над приложением ASP.Net, которое само по себе не является распределенным приложением, но в какой-то момент все его данные будут синхронизированы с главным узлом.
Для того, чтобы иметь возможность хранить данные из разных узлов в одной уникальной таблице
без проверки идентификаторов был применен подход:
- I. Не использовать автоматически сгенерированные идентификаторы
- II. Идентификатор строки будет составлен путем объединения NodeId + NextRowtId
NextRowId генерируется:
- Выбор наибольшего идентификатора из одного определенного узла,
- Разделение его на 2 части, первая из которых NodeId , а вторая LastDocumentId
- Увеличение LastDocumentId
- Объединить NodeId с увеличенным LastDocumentId
Например
Id = 20099, разделенный на ( NodeId = 200, LastDocumentId = 99)
LastDocumentId + 1 = 100
NextRowId = 200100
Это прекрасно работает в теории, или если запросы обрабатываются последовательно. Тем не менее, если несколько запросов обрабатываются одновременно, они часто генерируют один и тот же идентификатор.
На практике, если несколько, возникает коллизия идентификаторов, когда несколько пользователей пытаются обновить одну и ту же таблицу одновременно.
Я ознакомился с лучшими практиками создания уникальных идентификаторов для распределенных систем. Тем не менее, ни один из них не является жизнеспособным вариантом на данный момент, поскольку они потребуют переосмысления всей архитектуры, а также большого и большого количества рефакторинга. И то, и другое требует времени, которое руководство не позволит мне занять.
Так как же я могу гарантировать, что сгенерированные идентификаторы уникальны или что запросы обрабатываются последовательно? Все это, в идеале, без необходимости реструктуризации приложения или создания узких мест производительности.