Основываясь на идее @Chris о наличии таблицы для генерирования «следующей» идентичности. Более надежный способ сделать это состоит в том, чтобы иметь два сервера и круговой балансировщик нагрузки. Сервер 1 распределяет нечетные числа, Сервер 2 распределяет четные числа. Если вы потеряете один сервер, вы получите все шансы или все четные, но шоу все еще продолжается.
Flickr использует нечто очень похожее для своей системы идентификации
http://code.flickr.com/blog/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/
Затем творчески используйте атомарный синтаксис MYSQL REPLACE, как показано ниже:
CREATE TABLE `Tickets64` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`stub` char(1) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `stub` (`stub`)
) ENGINE=MyISAM
REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID();
Там, где значение заглушки достаточно для генерации следующего идентификатора атомарным способом.
Обновление с требованиями к хронологии и последовательности операций OP
С помощью Chronology в качестве драйвера ваш выбор меняет буквально - атомарное состояние в SPOF - например, идея Криса в SQL. Это будет узким местом, и его состояние должно быть долговечным, чтобы избежать выдачи дубликатов.
Чтобы достичь хронологии в масштабе с высокой доступностью в распределенной системе, алгоритмы причинно-следственной последовательности - в значительной степени единственный путь - есть несколько:
- метки времени Lamport
- Векторные часы
- Последовательности зависимостей
- Иерархические часы
Шаблон вызова совершенно отличается от стратегии SPOF, он требует, чтобы вы отслеживали и передавали памятку последовательности, метки времени или версии - фактически информацию сеанса для последовательности, которую вы генерируете. Однако они гарантируют причинный порядок для любой заданной последовательности или элемента даже в распределенной системе. В большинстве случаев событие PK будет составной частью идентификатора элемента + идентификатора причинной последовательности.