В общем, вы не можете иметь как «постоянно растущий», так и «без SPOF и без сложной синхронизации».
Если вы хотите иметь несколько ID-генераторов, которым не нужно спрашивать друг друга при каждом новом ID, каждому из них действительно нужен отдельный ID-пул.
Действительно простой пример упоминается в статье, на которую вы ссылаетесь: один сервер создает нечетные, а другой - четные. (Вы можете расширить это на несколько серверов тривиально). Конечно, тогда вы не можете быть уверены, что один сервер не работает впереди другого, что может привести к не увеличивающейся последовательности, такой как 111, 120, 113, 122, 115, 124 ...
Если вы хотите только «приблизительно увеличить», вы можете реализовать схему, в которой каждый сервер через определенные промежутки времени (например, каждую минуту или каждые 10000 идентификаторов) сообщает другому (им) свой текущий идентификатор, а другой затем переходит его собственное удостоверение личности (только вперед), если он висит слишком далеко. Это должно быть сделано способом, который не прерывает генерацию идентификатора, для надежности, если другой сервер не работает.
Ах, для "свободных битов в конце" просто умножьте свой идентификатор на несколько number
(один и тот же каждый раз, и степень два, если вам действительно нужны "свободные биты", а не только "место для data "), затем добавьте свои данные (которые должны быть меньше number
). Но, конечно, тогда у вас не хватит места для идентификатора немного раньше (по фактору number
).