Как генерировать идентификатор один за другим, когда нужно пересечь jvm

Мне нужно сгенерировать id, с помощью правила generate, определенного мной. Например:

  1. 0x-111-111-PX-2013-11-11-00001

  2. 0x-111-111-PX-2013-11-11-00002

Это легко сделать в одном jvm. Вопрос в том, что мне нужно пересечь jvm.

cross jvm означает генерировать уникальный идентификатор из разных машин

2 ответа

Генерирование случайного числа или случайной строки (UUID) всегда является проблемой. Даже обычный java.util.Random не идеален. Вы уже исключили использование баз данных, которые обеспечили бы случайность в JVM.

Эта проблема аналогична проблеме, с которой сталкивается веб-контейнер для генерации уникального идентификатора сеанса. Уникальность гарантируется, если задействована только одна JVM. Но в реальном мире это вряд ли так. Типичное веб-приложение развертывается в кластере серверов. На основе идентификатора сеанса балансировщик нагрузки пересылает запросы на соответствующий сервер.

Поскольку уникальность идентификатора сеанса не гарантируется в JVM, каждый сервер добавляет уникальный идентификатор (например.node1) к идентификатору сеанса, который гарантирует, что даже если два сервера сгенерируют один и тот же идентификатор сеанса, уникальность будет сохранена добавленной строкой.

Расширяя это до вашего случая, вы всегда можете указать конкретный идентификатор JVM в id, так что сгенерированный идентификатор может выглядеть,

  1. 0x-111-111-PX-2013-11-11-00001-М1
  2. 0x-111-111-PX-2013-11-11-00001-М2

Вы можете поместить M1/​​M2 в любом месте строки.

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


1) Вы можете использовать базу данных с хранимой процедурой, которая будет генерировать следующий идентификатор, как вы хотите

2) Java-приложение (служба), работающее только для цели генерации идентификаторов, например, RMI

3) Общий файл, который другие java-приложения будут обновлять с помощью того же алгоритма

licensed under cc by-sa 3.0 with attribution.