- PVSM.RU - https://www.pvsm.ru -

Встречайте UUID нового поколения для ключей высоконагруженных систем

Встречайте UUID нового поколения для ключей высоконагруженных систем - 1

31 марта 2022 года на сайте IETF [1] был официально размещен текст рабочего документа [2] (копия 1 [3], копия 2 [4]) New UUID Formats (далее – стандарт), который должен формально обновить, а фактически заменить давно устаревший и изначально ущербный RFC 4122 [5].

В стандарте представлены новые форматы универсальных уникальных идентификаторов (UUID [6]), имеющих следующие свойства:

  • для использования в высоконагруженных приложениях и базах данных – как монолитных, так и распределенных,

  • возрастающие по времени генерации (без дополнительных секунд [7]),

  • содержащие таймстемп, счетчик с инициализацией его сегментов нулем и псевдослучайным значением, а также собственно псевдослучайное значение,

  • объединенные с метаданными.

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

В долгих и жарких спорах [10] удалось выработать стандарт по существу безупречного качества. Хотя некоторые туманные формулировки и прежние неудачные варианты технических решений сохранились в тексте, однако найдены оригинальные и красивые решения всех проблем. Стоит особенно отметить творческий вклад жителя Японии с псевдонимом LiosK [11] и разумные решения инициаторов стандарта Brad Peabody [12] и Kyzer Davis [13] из США. Стандартом обеспечена максимально возможная скорость поиска записей по содержащемуся в них значению UUID. Стандарт содержит множество правильных рекомендаций с обоснованием. Единственный существенный изъян стандарта – это расточительное использование 6 из 128 битов UUID (сегменты ver и var) лишь для совместимости с отжившим RFC 4122. Стандарт превосходит ULID [14], KSUID [15], CUID [16] и остальные аналоги. Все они были исследованы [17] и указаны в стандарте.

Стандарт еще не утвержден, но поставщики СУБД уже могут начинать его реализовывать. Невозможно представить, что появится другой – более качественный и существенно отличающийся вариант стандарта. Приложенные к стандарту прототипы на языке C сильно упрощенные, и поэтому они не могут быть хорошей основой для разработки. Из трех предложенных форматов наибольшую практическую ценность представляет версия UUIDv7.

В текущую версию стандарта из-за нехватки времени не вошли альтернативные текстовые кодировки UUID. Инициаторы стандарта хотят включить их в следующую версию стандарта, причем кодировка Crockford’s Base32 [18] уже ими одобрена.

Хотя стандарт предоставляет разработчикам генераторов UUID значительную свободу в очерченных рамках, но эталонная структура UUID, которая обсуждалась при выработке стандарта, следующая:

Обозначение в стандарте

Позиция сегмента в UUID слева направо

Длина, битов

Двоичное значение или алгоритм расчета

Предназначение

unix_ts_ms

1

48

Количество миллисекунд с полуночи (00:00:00) 1 января 1970 года по всемирному координированному времени (UTC) минус дополнительные секунды

Обеспечение монотонности записываемых UUID. Таймстемп с миллисекундной точностью, отстающий от UTC на десятки секунд. Миллисекунда - это максимально возможная точность для упорядочения по моменту времени генерации UUID, приходящих из разных источников

ver

2

4

"0111"

Версия UUIDv7. Смысл этого сегмента лишь в совместимости с RFC 4122

rand_a

3

1

Сегмент счетчика, инициализируемый нулем каждую миллисекунду

Защита от переполнения счетчика при маловероятной неудачной инициализации счетчика большим псевдослучайным значением

4

11

Сегмент счетчика, инициализируемый псевдослучайным значением каждую миллисекунду

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

var

5

2

"10"

Вариант, детально описанный в стандарте или в RFC 4122, в отличие от других упомянутых в RFC 4122 вариантов. Смысл этого сегмента лишь в совместимости с RFC 4122

rand_b

6

12

Сегмент счетчика, инициализируемый псевдослучайным значением каждую миллисекунду

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

7

50

Псевдослучайное значение, сгенерированное отдельно для каждого UUID

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

обозначение отсутствует

справа от UUID в идентификаторе, используемом в качестве уникального или суррогатного ключа

любая

Кастомный сегмент, который может быть составным

См. под таблицей возможные элементы кастомного сегмента

Возможные элементы кастомного сегмента:

  • дополнительное псевдослучайное значение

  • тип сущности или код таблицы базы данных

  • пространство имен

  • shard (сегмент) или partition (секция)

  • код источника данных

  • код типа операции или типа сообщения

  • контрольная сумма

  • другие элементы, специфичные для приложения

Автор:
SergeyProkhorenko

Источник [19]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/vy-sokaya-proizvoditel-nost/373640

Ссылки в тексте:

[1] IETF: https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%BD%D1%8B%D0%B9_%D1%81%D0%BE%D0%B2%D0%B5%D1%82_%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82%D0%B0

[2] текст рабочего документа: https://www.ietf.org/archive/id/draft-peabody-dispatch-new-uuid-format-03.html

[3] копия 1: https://uuid6.github.io/uuid6-ietf-draft/

[4] копия 2: https://datatracker.ietf.org/doc/draft-peabody-dispatch-new-uuid-format/

[5] RFC 4122: https://www.rfc-editor.org/rfc/rfc4122

[6] UUID: https://ru.wikipedia.org/wiki/UUID

[7] дополнительных секунд: https://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D0%BA%D1%83%D0%BD%D0%B4%D0%B0

[8] хронологических баз данных: https://en.wikipedia.org/wiki/Temporal_database

[9] полиморфных отношениях: https://habr.com/ru/post/261835/

[10] долгих и жарких спорах: https://github.com/uuid6/uuid6-ietf-draft/issues

[11] LiosK: https://github.com/LiosK

[12] Brad Peabody: https://github.com/bradleypeabody

[13] Kyzer Davis: https://github.com/kyzer-davis

[14] ULID: https://github.com/ulid/spec

[15] KSUID: https://github.com/segmentio/ksuid

[16] CUID: https://github.com/ericelliott/cuid

[17] исследованы: https://github.com/uuid6/uuid6-ietf-draft/tree/master/research

[18] Crockford’s Base32: http://www.crockford.com/base32.html

[19] Источник: https://habr.com/ru/post/658855/?utm_source=habrahabr&utm_medium=rss&utm_campaign=658855