Хорошо, это очень старый вопрос, который я впервые вижу сейчас.
Вам нужно будет различать порядковые номера и уникальные идентификаторы , которые (необязательно) можно легко сортировать по определенным критериям (обычно по времени генерации). Истинные порядковые номера подразумевают знание того, что сделали все другие исполнители, и поэтому требуют общего состояния. Нет простого способа сделать это распределенным и крупномасштабным способом. Вы можете изучить такие вещи, как сетевые трансляции, оконные диапазоны для каждого рабочего и распределенные хэш-таблицы для уникальных идентификаторов рабочих. , но это большая работа.
Уникальные идентификаторы - другое дело, есть несколько хороших способов децентрализованно генерировать уникальные идентификаторы:
а) Вы можете использовать сетевой сервис Twitter Snowflake ID . Снежинка - это:
- Сетевая услуга, т. Е. Вы совершаете сетевой вызов, чтобы получить уникальный идентификатор;
- который производит 64-битные уникальные идентификаторы, упорядоченные по времени генерации;
- и сервис хорошо масштабируется и (потенциально) высокодоступен; каждый экземпляр может генерировать много тысяч идентификаторов в секунду, и вы можете запускать несколько экземпляров в своей LAN / WAN;
- написан на Scala, работает на JVM.
б) Вы можете генерировать уникальные идентификаторы для самих клиентов, используя подход, основанный на том, как создаются идентификаторы UUID и Snowflake. Есть несколько вариантов, но что-то вроде:
Старшие 40 или около того бит: метка времени; время генерации идентификатора. (Мы используем наиболее значимые биты для метки времени, чтобы идентификаторы можно было сортировать по времени генерации.)
Следующие 14 или около того битов: счетчик для каждого генератора , который каждый генератор увеличивает на единицу для каждого нового сгенерированного идентификатора. Это гарантирует, что идентификаторы, сгенерированные в один и тот же момент (одинаковые временные метки), не перекрываются.
Последние 10 или около того битов: уникальное значение для каждого генератора. Используя это, нам не нужно выполнять какую-либо синхронизацию между генераторами (что чрезвычайно сложно), поскольку все генераторы производят неперекрывающиеся идентификаторы из-за этого значения.
c) Вы можете генерировать идентификаторы клиентов, используя только временную метку и случайное значение. Это позволяет избежать необходимости знать все генераторы и назначать каждому генератору уникальное значение. С другой стороны, не гарантируется , что такие идентификаторы будут глобально уникальными, они будут уникальными только с большой вероятностью . (Чтобы столкнуться, один или несколько генераторов должны будут создать одно и то же случайное значение в одно и то же время.) Что-то вроде:
- Старшие 32 бита: отметка времени, время генерации идентификатора.
- Наименее значимые 32 бита: 32 бита случайности, генерируемые заново для каждого идентификатора.
г) Самый простой выход - использовать UUID / GUID .