UUID Создано случайным образом, имеет дубликаты

Я использую функцию ниже для генерации UUID

UUID.randomUUID().toString()

На производстве у нас есть серверы 50+ (сервер приложений - каждый является собственной JVM), и для запросов, которые попадают на эти серверы, в качестве первого шага мы генерируем UUID, который по существу уникально идентифицирует транзакцию.

Мы наблюдаем, что на Сервере 6 и Сервере 11 сгенерированные идентификаторы UUID соответствуют по меньшей мере для 10-15 сообщений в день, что странно, поскольку при нагрузке, т.е. около 1 миллиона транзакций в день, эти идентификаторы UUID дублируются в течение одного дня. очень странно

Это то, что мы сделали до сих пор

  1. Проверенные журналы приложений - мы не нашли ничего подозрительного, все журналы в порядке
  2. Попытался воспроизвести эту проблему в тестовой среде с аналогичной нагрузкой на производстве и с серверами 50+ - но в тестовой среде этого не произошло
  3. Проверил логику приложения - это, кажется, не проблема, потому что все остальные 48 серверов, кроме 6 и 11, которые имеют копию одной и той же базы кода, работают отлично, и они генерируют уникальные UUID для каждой транзакции.

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

Ответ 1

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

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

Итак, создайте UUID-сервер. Это просто процесс, который производит блоки UUID. Каждый блок состоит, может быть, из 10000 (или что там уместно) UUID. Процесс записывает каждый блок на диск после того, как процесс проверяет, что блок не содержит дубликатов.

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

Ответ 2

Я бы не стал тратить время на размышления о том, как UUID.randomUUID() генерирует несколько дубликатов UUID в день. Вероятность того, что это произошло случайно, бесконечно мала. (Генерация целой серии дубликатов возможна - если дублируется базовое состояние ГСЧ, но это не так.)

Вместо этого ищите места, где UUID, сохраненный одним сервером, мог бы забить один, сохраненный другим. Почему это происходит только между 2 серверами из 50? Это как-то связано с деталями вашей среды и системы, которые не были переданы.