Я обычно реализовывал последовательности базы данных использования поколения порядкового номера в прошлом.
например, Используя Пост-ГРЭС ПОСЛЕДОВАТЕЛЬНЫЙ тип http://www.neilconway.org/docs/sequences/
Мне любопытно, хотя как, как генерировать порядковые номера для больших распределенных систем, где нет никакой базы данных. У кого-либо есть опыт или предложения лучшей практики для достижения поколения порядкового номера ориентированным на многопотоковое исполнение способом для нескольких клиентов?
У каждого узла может быть уникальный идентификатор (который у вас может быть в любом случае), а затем добавить его к порядковому номеру.
Например, узел 1 генерирует последовательность 001-00001 001-00002 001-00003 и т. Д., А узел 5 генерирует 005-00001 005-00002
Уникальный: -)
В качестве альтернативы, если вам нужен какой-то централизованный системы, вы можете подумать о том, чтобы ваш сервер последовательностей выдавал блоки. Это значительно снижает накладные расходы. Например, вместо того, чтобы запрашивать новый идентификатор с центрального сервера для каждого идентификатора, который должен быть назначен, вы запрашиваете идентификаторы блоками по 10 000 с центрального сервера, а затем вам нужно выполнить еще один сетевой запрос, когда они закончатся.
Почему бы не использовать (поточно-ориентированный) генератор UUID?
Мне, вероятно, следует подробнее остановиться на этом.
Гарантируется, что идентификаторы UUID будут уникальными в глобальном масштабе (если вы избегаете идентификаторов, основанных на случайных числах, где уникальность очень высока).
Ваше «распределенное» требование выполняется независимо от того, сколько генераторов UUID вы используете, благодаря глобальной уникальности каждого UUID.
Требование «потокобезопасности» можно удовлетворить, выбрав «потокобезопасные» генераторы UUID.
Предполагается, что ваше требование «порядкового номера» удовлетворяется за счет гарантированной глобальной уникальности каждого UUID.
Обратите внимание, что многие реализации порядковых номеров баз данных (например, Oracle) не гарантируют ни монотонно возрастающих, ни (даже) возрастающих порядковых номеров (для каждого «соединения»). Это связано с тем, что последовательный пакет порядковых номеров выделяется в «кэшированных» блоках для каждого соединения. Это гарантирует глобальную уникальность и поддерживает адекватную скорость. Но фактически назначенные порядковые номера (с течением времени) могут быть беспорядочными, когда они выделяются несколькими соединениями!
Есть несколько стратегий; но ни один из тех, что я знаю, не может быть действительно распределен и давать реальную последовательность.
memcached
имеет быстрый атомный счетчик, в подавляющем большинстве случаев он достаточно быстрый для всего кластера. лично я бы предпочел UUID или memcached, если я хочу иметь в основном непрерывное пространство.
Если он действительно должен быть глобально последовательным, а не просто уникальным, то я бы подумал о создании единой простой службы для выдачи этих номеров.
Распределенные системы полагаются на множество взаимодействующих небольших сервисов, и для решения этой простой задачи вам действительно нужно или действительно ли вам выгодно какое-то другое сложное распределенное решение?