Какова вероятность коллизии на множественной JVM, Java UUID.randomUUID? - PullRequest
1 голос
/ 06 августа 2020

Я создаю архитектуру на основе микросервисов, в которой несколько микросервисов работают параллельно для горизонтальной масштабируемости. Все службы используют один и тот же алгоритм для генерации UUID (UUID.randomUUID), после того как UUID сгенерирован, он сохраняется в базе данных и возвращается вызывающей службе. Через несколько секунд вызывающий абонент отправляет запрос на проверку статуса txn с UUID.

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

  1. какова вероятность дублирования UUID в JVM?
  2. Следует ли нам добавить лог c в код, чтобы проверить конфликт перед сохранением его в БД?

1 Ответ

2 голосов
/ 06 августа 2020
  1. Какова вероятность дублирования UUID в JVM.

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

Например, со 128-битными случайными UUID (и случайным числом высокого качества генератор) в таблице указано, что вам нужно будет сгенерировать 2,6 x 10 10 UUID, чтобы вероятность столкновения достигла 1 из 10 18 .

Ранее в в статье вы найдете математику по вычислению ... и оценке ... вероятностей.

Должны ли мы добавить лог c в код для проверки столкновения перед сохранением его в БД?

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

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

Дополнительные вопросы:

Я не уверен, относится ли эта вероятность к одному или нескольким генераторам?

Количество генераторов не имеет значения, при условии, что они > независимые <генераторы случайных чисел. </p>

Как мы видели несколько сотен раз столкновения с 1 миллионом TXN.

Математика не делает l ie. Если вы видели коллизию несколько сотен раз с 1 миллионом транзакций, то что-то еще неверно. Предположения неверны.

Например:

  • Возможно, вы используете слабый ГПСЧ.
  • Возможно, вы используете фиксированное начальное число или плохой источник энтропия при заполнении PRNG.
  • Возможно, вы модифицируете (например, сокращаете) UUID таким образом, чтобы резко уменьшить их эффективное количество бит.
  • Возможно, что-то в вашей методологии генерации UUID заставляет UUID выдаваться дважды подряд ... иногда.
  • Возможно, объекты дублируются, хотя их не должно быть ... и вы получаете две копии объекта с одинаковым UUID.
  • Возможно, кто-то / что-то подделывает UUID.

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

Мои сомнения - это все 4 службы используют один и тот же алгоритм, вероятность возрастет.

Как я уже сказал, количество генераторов не влияет на математику.

...