Распределенное поколение порядкового номера?

Я обычно реализовывал последовательности базы данных использования поколения порядкового номера в прошлом.

например, Используя Пост-ГРЭС ПОСЛЕДОВАТЕЛЬНЫЙ тип http://www.neilconway.org/docs/sequences/

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

97
задан Lorenzo Belli 20 December 2016 в 12:21
поделиться

4 ответа

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

Например, узел 1 генерирует последовательность 001-00001 001-00002 001-00003 и т. Д., А узел 5 генерирует 005-00001 005-00002

Уникальный: -)

В качестве альтернативы, если вам нужен какой-то централизованный системы, вы можете подумать о том, чтобы ваш сервер последовательностей выдавал блоки. Это значительно снижает накладные расходы. Например, вместо того, чтобы запрашивать новый идентификатор с центрального сервера для каждого идентификатора, который должен быть назначен, вы запрашиваете идентификаторы блоками по 10 000 с центрального сервера, а затем вам нужно выполнить еще один сетевой запрос, когда они закончатся.

15
ответ дан 24 November 2019 в 05:27
поделиться

Почему бы не использовать (поточно-ориентированный) генератор UUID?

Мне, вероятно, следует подробнее остановиться на этом.

Гарантируется, что идентификаторы UUID будут уникальными в глобальном масштабе (если вы избегаете идентификаторов, основанных на случайных числах, где уникальность очень высока).

Ваше «распределенное» требование выполняется независимо от того, сколько генераторов UUID вы используете, благодаря глобальной уникальности каждого UUID.

Требование «потокобезопасности» можно удовлетворить, выбрав «потокобезопасные» генераторы UUID.

Предполагается, что ваше требование «порядкового номера» удовлетворяется за счет гарантированной глобальной уникальности каждого UUID.

Обратите внимание, что многие реализации порядковых номеров баз данных (например, Oracle) не гарантируют ни монотонно возрастающих, ни (даже) возрастающих порядковых номеров (для каждого «соединения»). Это связано с тем, что последовательный пакет порядковых номеров выделяется в «кэшированных» блоках для каждого соединения. Это гарантирует глобальную уникальность и поддерживает адекватную скорость. Но фактически назначенные порядковые номера (с течением времени) могут быть беспорядочными, когда они выделяются несколькими соединениями!

4
ответ дан 24 November 2019 в 05:27
поделиться

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

  1. имеют центральный генератор чисел. это не обязательно должна быть большая база данных. memcached имеет быстрый атомный счетчик, в подавляющем большинстве случаев он достаточно быстрый для всего кластера.
  2. разделяют целочисленный диапазон для каждого узла (например, ответ Стивена Шлансктера )
  3. используют случайные числа или UUID
  4. используют часть данных вместе с идентификатором узла и хешируют все это ( или hmac it)

лично я бы предпочел UUID или memcached, если я хочу иметь в основном непрерывное пространство.

6
ответ дан 24 November 2019 в 05:27
поделиться

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

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

8
ответ дан 24 November 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: