Генерация монотонно увеличивающихся целых чисел (максимум 64 бита)

В рамках нового проекта нам нужен сервис, который может генерировать монотонно увеличивающиеся целые числа. Требования к услуге:

  1. сервис не должен производить непрерывное целое число, пока он производит монотонно увеличивающиеся целые числа, это должно быть хорошо
  2. Это должно вывести 64-битное целое число
  3. сервис должен быть высокодоступным
  4. службы должны быть отказоустойчивыми (или перезагружаться)

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

Может ли кто-нибудь помочь мне в разработке такой системы / службы.

2 ответа

Ваши требования 1 и 3 несколько противоречивы. Требование монотонного увеличения означает, что единственная услуга должна предоставлять значения, и она не будет высокой доступности.

Например, последовательность базы данных Oracle поможет вам, если у вас один сервер базы данных. Но как только вы переходите к кластеру машин, пакеты целых чисел предоставляются каждому участнику кластера и распределяются последовательно при попадании в этот элемент. Они гарантированно будут уникальными, но не монотонно растущими.

Возможно, вы могли бы построить систему, основанную на времени (с точностью до наносекунды, если это возможно), с логикой для обнаружения и корректировки дубликатов. Это не будет очень доступно...

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

Вы просите часы.

Условно говоря это невозможно

Смотрите эту статью в Википедии для отличного учебника.

Согласно специальной теории относительности, нельзя сказать в абсолютном смысле, что два разных события происходят одновременно, если эти события разделены в пространстве. Например, автокатастрофа в Лондоне и еще одна в Нью-Йорке, которые, по-видимому, произошли одновременно с наблюдателем на земле, по-видимому, произошли в немного отличающееся время от наблюдателя на самолете, летящем между Лондоном и Нью-Йорком., Вопрос о том, являются ли события одновременными, является относительным: в стационарной системе координат Земли два несчастных случая могут произойти одновременно, но в других кадрах (в другом состоянии движения относительно событий) сначала может произойти авария в Лондоне, и в некоторых других кадрах нью-йоркский крах может произойти первым. Однако, если два события могут быть причинно связаны (т. Е. Время между событием A и событием B больше, чем расстояние между ними, деленное на скорость света), порядок сохраняется (т. Е. "Событие A предшествует событию B") во всех системах отсчета.

Практически говоря, это тривиально

Скорее всего, анализ ваших бизнес-требований показал бы, что

  • Все участники привязаны к земле (имеют одинаковую систему координат), или
  • Интересные события причинно связаны.

в этом случае будет достаточно простого NTP. Правительство уже предоставляет эту услугу. http://tf.nist.gov/tf-cgi/servers.cgi

Другие вопросы по тегам