Распределенная глобальная стратегия генерации уникальных идентификаторов

распределенный

«Уникальный идентификатор» — это очень распространенное требование в приложениях, оно используется для уникальной идентификации бизнес-объекта, ресурса, сообщения и т. д. В базе данных уникальный идентификатор обычно используется в качестве первичного ключа данных. Друзья, прочитавшие предыдущую статью о принципе индексации MySQL, должны знать, что важность первичного ключа для базы данных очевидна.

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

Но если вы хотите создать глобально уникальный идентификатор в распределенном сценарии, все немного по-другому. Поскольку распределенные системы обычноВысокий параллелизмСцена, естественным образом не подходит для использования самообумеренной функции автономной базы данных. Если ваш технический выбор оказывается «неразделенной базой данных», как MySQL, вы должны обратиться к обычному распределенному глобальному уникальному стратегии генерации ID.

UUID

Полное название UUID — Universally Unique Identifier, что переводится как Универсальный Уникальный Идентификатор. Стандартная форма содержит 32 шестнадцатеричных цифры, разделенных на пять сегментов дефисами, и 36 символов в виде 8-4-4-4-12, например:9628f6e9-70ca-45aa-9f7c-77afe0d26e05, на данный момент в отрасли существует 5 способов создания UUID.Подробности см. в спецификации UUID «Пространство имен URN универсального уникального идентификатора (UUID)», выпущенной IETF, которая называется 5 версиями UUID.

Поставляется с JDKUUIDКлассы могут генерировать UUID версии 3 и версии 4. Итак, вот краткое введение в то, как генерируются UUID версии 3 и версии 4.

  • UUID версии 3: получен путем вычисления хэша MD5 имени и пространства имен.
  • Версия 4 UUID: UUID сгенерировал случайное число или псевдослучайное число. Вероятность этого UUID сгенерированного дубликата может быть рассчитана, но потенциал для дублирования незначительно, поэтому эта версия также часто используется версия.

image.png

Существуют также веб-сайты, которые генерируют UUID онлайн.Если UUID используются в вашем проекте, их можно использовать для создания временных тестовых данных.www.uuidgenerator.net/

Преимущество UUID в том, чтоЭто просто реализовать, вы можете получить его с помощью собственного API JDK. Недостатком является то, что он не соответствует стратегии индексации первичного ключа базы данных, основанной на механизме b-дерева, и не подходит в качестве первичного ключа базы данных в высокопроизводительных сценариях.

Реализация на основе Redis

Все они распределены, и большинство из них нужно кэшировать. Для кэширования можно использовать Redis. РедисINCRФункции — это атомарные операции на одной машине, гарантированно уникальные и инкрементальные.

单机Redis可能无法支撑高并发。而如果使用Redis集群,如何保证ID的唯一性呢? можно использоватьразмер шагаПуть. Например, в кластере, состоящем из 5 узлов Redis, их сгенерированные идентификаторы:

A: 1,6,11,16,21

B: 2,7,12,17,22

C: 3,8,13,18,23

D: 4,9,14,19,24

E: 5,10,15,20,25

Классная программа «Снежинка»

TwitterИспользование Zookeeper для реализации службы генерации глобальных идентификаторовsnowflake. Структура данных сгенерированного идентификатора показана на следующем рисунке:

snowflake格式

Всего 64 бита, что точно соответствует стандарту Java.long型,第一个符号位不用,然后41位用于表示时间戳。 Subsequent 10 bits used to represent the ID of the node, if it is a multi-machine room node, you can divide the first 5 bits to indicate the machine room ID, the 5 bits used to represent the ID of the machine under each computer номер.最后12位用来表示序列号,这样可以做到同一毫秒,同一机器生成多个id,12位算下来最多支持4096个。

Временная метка здесь — это не метка времени текущего времени, а разница между текущим временем и временем начала. 41 бит длится около 69 лет, если считать в миллисекундах.

Существует множество вариантов алгоритма снежинки. Вы можете настроить распределение битов в соответствии с вашей реальной ситуацией, например, временная метка занимает 42 бита, а идентификатор машины — 9 бит. 42-битная временная метка может использовать 138 лет и т. д.

UidGenerator от Baidu и Leaf от Meituan — это варианты на основе снежинок.

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

Но и у него есть свои недостаткиСильные сервер-зависимые часы, если часы сервера вернутся назад (например, дополнительная секунда или синхронизация NTP), это приведет к дублированию идентификатора.

Meituan's Leaf решает проблему обратного вызова часов Конкретный процесс выглядит следующим образом:

Leaf时钟回拨

другие методы

Конечно, есть и другие схемы генерации ID, такие как:

  • Диди: время + номер стартовой точки + номерной знак

  • Порядок Taobao: временная метка + идентификатор пользователя

  • Другая электронная коммерция: Timestamp + Channel Channel + ID пользователя, а некоторые добавят идентификатор первого элемента в порядке.

  • Идентификатор MongoDB: это также тип снежинки. Через «время + машинный код + pid + inc» всего 12 байтов, 4 + 3 + 2 + 3, наконец, идентифицируется как шестнадцатеричный символ длиной 24.

Суммировать

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

Если вы хотите использовать его в качестве первичного ключа базы данных и не используете распределенную базу данных (например, TiDB, MongoDB и т. д.), вы можете рассмотреть возможность использования алгоритма снежинки.Рекомендуется использовать Meituan's Leaf.

Распределенный идентификатор Sharding Matherware Sharding-JDBC принимает алгоритм снежинки, открытый в Twitter, и не нужно полагаться на любые сторонние компоненты, так что его масштабируемость и обслуживание значительно упрощены; однако дефекты алгоритма снежинки (Сильная зависимость вовремя, если часы возвращаются на циферблат, он будет генерировать дубликаты идентификаторы), Sharding-JDBC не предоставляет решения, если пользователи хотят укрепить, им нужно расширить самим собой.

Внимательно пишите статьи и делитесь ими с душой.

Персональный сайт:yasinshaw.com

Общедоступный номер: технический круг xy