Генерация распределенного порядкового номера? - PullRequest
92 голосов
/ 20 апреля 2010

Я обычно реализовывал генерацию порядкового номера с использованием последовательностей базы данных в прошлом.

например. Использование Postgres SERIAL типа http://www.neilconway.org/docs/sequences/

Мне любопытно, как генерировать порядковые номера для больших распределенных систем, где нет базы данных. Кто-нибудь имеет какой-либо опыт или предложения передовой практики для достижения генерации порядкового номера потокобезопасным способом для нескольких клиентов?

Ответы [ 13 ]

0 голосов
/ 23 августа 2017

Проблема похожа на: В мире iscsi, где каждый лун / том должен быть уникально идентифицирован инициаторами, работающими на стороне клиента. Стандарт iscsi гласит, что первые несколько бит должны представлять информацию о поставщике / изготовителе хранилища, а остальные монотонно увеличиваются.

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

0 голосов
/ 25 ноября 2016

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

У меня была похожая проблема. У меня было несколько разделов, и я хотел получить счетчик смещения для каждого. Я реализовал что-то вроде этого:

CREATE DATABASE example;
USE example;
CREATE TABLE offsets (partition INTEGER, offset LONG, PRIMARY KEY (partition));
INSERT offsets VALUES (1,0);

Затем выполнил следующий оператор:

SELECT @offset := offset from offsets WHERE partition=1 FOR UPDATE;
UPDATE offsets set offset=@offset+1 WHERE partition=1;

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

SELECT @offset := offset from offsets WHERE partition=1 FOR UPDATE;
UPDATE offsets set offset=@offset+100 WHERE partition=1;

Если вам нужна дополнительная пропускная способность и вы не можете заранее распределить смещения, вы можете реализовать свой собственный сервис, используя Flink для обработки в реальном времени. Мне удалось получить около 100K приращений на раздел.

Надеюсь, это поможет!

0 голосов
/ 14 июля 2014

Я написал простой сервис, который может генерировать полу-уникальные непоследовательные 64-битные числа.Он может быть развернут на нескольких машинах для обеспечения избыточности и масштабируемости.Он использует ZeroMQ для обмена сообщениями.Для получения дополнительной информации о том, как это работает, смотрите страницу github: zUID

...