Если вы не слишком строги в последовательности, вы можете «осколить» свой инкрементатор.Это можно рассматривать как «в конечном итоге последовательный» счетчик.
По сути, у вас есть одна сущность, которая является «основным» счетчиком.Затем у вас есть несколько сущностей (в зависимости от нагрузки, которую вам нужно обработать), которые имеют свои собственные счетчики.Эти осколки резервируют куски идентификаторов из мастера и подают их из диапазона, пока у них не заканчиваются значения.
Быстрый алгоритм:
- Вам необходимо получить идентификатор.
- Выберите шард наугад.
- Если начало осколка меньше его конца, возьмите его начало и увеличьте его.
- Если начало осколка равно (или болеео) его конец, иди к мастеру, возьми значение и добавь к нему сумму
n
.Задайте для начального значения извлечения шарды плюс единицу, а для окончательного извлечения - плюс n
.
Это может масштабироваться довольно хорошо, однако количество, на которое вы можете выйти, равно количеству умноженных осколков.по вашему n
значению.Если вы хотите, чтобы ваши записи отображались, это, вероятно, сработает, но если вы хотите, чтобы они представляли порядок, это не будет точным.Также важно отметить, что в последних значениях могут быть дыры, поэтому, если вы по какой-то причине используете это для сканирования, вам нужно учитывать пробелы.
Редактировать
Мне это нужно длямое приложение (именно поэтому я искал вопрос: P), поэтому я реализовал свое решение.Он может захватывать отдельные идентификаторы, а также эффективно захватывать партии.Я проверил его в контролируемой среде (на appengine), и он работал очень хорошо.Вы можете найти код на github .