Подтвердить что ты не робот

Вероятность столкновения объекта ObjectId против UUID в большой распределенной системе

Учитывая, что UUID rfc 4122 (16 байт) намного больше, чем MongoDB ObjectId (12 байтов), я пытаюсь выяснить, как их вероятность столкновения сравнивается.

Я знаю, что это что-то вокруг довольно маловероятно, но в моем случае большинство идентификаторов будут генерироваться в большом количестве мобильных клиентов, а не в ограниченном наборе серверов. Интересно, если в этом случае есть обоснованная озабоченность.

По сравнению с обычным случаем, когда все идентификаторы генерируются небольшим числом клиентов:

  • Может потребоваться несколько месяцев для обнаружения столкновения с момента создания документа
  • Идентификаторы генерируются из гораздо большей клиентской базы
  • Каждый клиент имеет более низкий уровень генерации идентификатора
4b9b3361

Ответ 1

в моем случае большинство идентификаторов будут генерироваться в большом количестве мобильных клиентов, а не в ограниченном наборе серверов. Интересно, если в этом случае есть обоснованная озабоченность.

Для меня это звучит как очень плохая архитектура. Вы используете двухуровневую архитектуру? Почему мобильные клиенты имеют прямой доступ к db? Вы действительно хотите полагаться на сетевую безопасность?

В любом случае, некоторые рассуждения о вероятности столкновения:

Ни UUID, ни ObjectId не зависят от их огромного размера, т.е. оба не являются случайными числами, но они следуют схеме, которая пытается систематически уменьшить вероятность столкновения. В случае ObjectIds их структура::

  • 4 байта с момента unix
  • 3 байта идентификатор машины
  • 2 байтовый идентификатор процесса
  • счетчик по 3 байта

Это означает, что, вопреки UUID, ObjectIds являются монотонными (за исключением одной секунды), что, вероятно, является их самым важным свойством. Монотонные индексы приведут к тому, что B-Tree будет заполнено более эффективно, оно позволяет подкачки по идентификатору и позволяет "сортировать по умолчанию" по id, чтобы ваши курсоры были стабильными и, конечно же, они несли простую временную метку. Это оптимизация, о которой вы должны знать, и они могут быть огромными.

Как вы можете видеть из структуры других 3 компонентов, столкновения становятся очень вероятными, если вы делаете > 1k inserts/s для одного процесса (не реально, даже с сервера), или если число (около дня рождения), или если количество процессов на одной машине слишком велико (опять же, это не случайные числа, но они действительно уникальны на машине, но они должны быть сокращены до двух байтов).

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

Ответ 2

Посмотрите на спецификацию для "ObjectId" из документации :

Обзор

ObjectId - это 12-байтовый тип BSON, построенный с использованием:

  • 4-байтовое значение, представляющее секунды с эпохи Unix,
  • 3-байтовый идентификатор машины,
  • двухбайтовый идентификатор процесса и
  • 3-байтовый счетчик, начиная со случайного значения.

Итак, рассмотрим это в контексте "мобильного клиента".

Примечание. Контекст здесь не означает использование "прямого" подключения "мобильного клиента" к базе данных. Это должно быть не. Но генерация "_id" может выполняться довольно просто.

Итак, точки:

  • Значение для секунд с эпохи. Это будет довольно случайным для каждого запроса. Таким образом, минимальный эффект столкновения зависит только от этого компонента. Хотя в "секундах".

  • "Идентификатор машины". Таким образом, этот есть другой клиент, генерирующий значение _id. Это устраняет возможность дальнейшего "столкновения".

  • Идентификатор процесса. Поэтому, когда это доступно для семян (и должно быть), тогда сгенерированный _id имеет больше вероятность избежать столкновения.

  • "Случайное значение". Таким образом, другому "клиенту" удалось создать все те же значения, что и выше, и еще удалось создать одно и то же случайное значение.

Нижняя строка - если , что не является достаточно убедительным аргументом для переваривания, просто укажите свои собственные записи "uuid" в качестве значений "первичного ключа".

Но ИМХО, это должен быть справедливый убедительный аргумент, чтобы рассмотреть, что аспекты столкновения здесь очень широкие. По меньшей мере.

Тема полная, вероятно, немного "слишком широкая". Но я надеюсь, что это переместится немного дальше от "Довольно маловероятно" и на что-то более конкретное.