Как создать 16-значный уникальный номер для каждого вызова службой, развернутой на нескольких серверах без базы данных? - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть сервис Java, который генерирует 16-значный уникальный номер, используя текущее время в формате yymmddhhmmssmsms. И он обрабатывает несколько вызовов в одну и ту же милисекунду с помощью Atomic Long. Но теперь проблема в том, что мне нужен этот сервис на нескольких облачных машинах. Как я могу обрабатывать звонки в одну микросекунду на разных серверах и генерировать уникальный номер для каждого из этих звонков. И я не хочу использовать базу данных для этого.

РЕДАКТИРОВАТЬ: я понимаю, UUID может быть решением. Но UUID генерирует случайное нет. каждый раз, не уникальный, хотя шансы на столкновение очень низки.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Использование одного случайного числа (например, случайного UUID) следует выполнять только в том случае, если -

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

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

См. также мой раздел о генерации уникальныхслучайные идентификаторы .

0 голосов
/ 05 ноября 2019

UUID v4 является правильным выбором для распределенных систем.

Реализация UUID v4 использует случайные числа в качестве источника. Java-реализация - это SecureRandom, которая использует непредсказуемое значение в качестве начального числа для генерации случайных чисел, чтобы уменьшить вероятность коллизий. Источник: https://www.baeldung.com/java-uuid

Безопасное случайное число: этот класс предоставляет криптографически сильный генератор случайных чисел (ГСЧ). Источник: https://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html

Пример использования UUID:

UUID uuid = UUID.randomUUID();
...