Вот что я понял до сих пор:
Для начала, цель local_seq
действительно намного менее ясна в CouchDB 2.x. Как уже упоминалось в вопросе, на уровне базы данных / _changes порядковые номера были заменены «непрозрачным токеном», который официально не имеет никакого отношения к local_seq.
Что еще хуже, кажется, что значение local_seq
, хранящееся в [или, по крайней мере, выводимом из] каждого документа, не локально для базы данных , а для осколка ! (Каждая база данных внутренне разделена на несколько частей; подробности о Осколках и репликах см. В документации.)
Так, в то время как в CouchDB 1.x можно, например, создать пользовательский фид изменений, отправив local_seq как часть ключа индекса map-Reduce - и он будет соответствовать значениям ?since=N
_changes базы данных. feed - в кластерно-ориентированном CouchDB 2.x такое представление будет иметь тенденцию испускать несколько документов [до одного от каждого шарда], которые имеют одинаковое поле ._local_seq
друг с другом!
А с другой стороны, в CouchDB 2.x даже "seq"
, связанный с конкретным документом в фиде _changes уровня базы данных, может меняться от запроса к запросу - и префикс, и / или большой длинный беспорядок после Это. Я не уверен, есть ли способ или какое-либо полезное преимущество, чтобы механизм представления мог предоставить значение «нелокальной последовательности» для функции map
, как это делается с локальной последовательностью.
Тем не менее, в CouchDB 2.3.0 я нашел "случайный" способ сохранить некоторую полезность:
- Путем создания базы данных с
PUT /newdb?n=1&q=1
- то есть настройкой 1 реплики и только 1 шарда - значения local_seq в конечном итоге становятся уникальными в базе данных.
- В этих обстоятельствах первая часть каждого
seq
токена в канале _changes уровня базы данных также кажется совпадает с local_seq каждого измененного документа. То есть если вы разделите строковый токен на '-'
и преобразуете первую часть в число, вы получите local_seq.
Я бы использовал это с осторожностью:
- в случае, если вам нужно необходимо увеличить масштаб и выбрать для этого использование многоузловых функций кластеризации, любой код, основанный на вышеприведенном, сломается
- это ни в коем случае официально не санкционировано, и теоретически может взломать столько, сколько точечный выпуск. Разработчикам CouchDB было совершенно ясно, что токены уровня _changes непрозрачны и что вы должны обращаться с ними как таковыми.
Итак предостережение хакора и все вышеперечисленное, "совпадения", приведенные выше, соответствуют описанию того, как эти токены работают в данный момент:
Число на передней панели является суммой отдельных последовательностей обновлений, закодированных во второй части, и существует только для того, чтобы обмануть более старые версии репликатора couchdb в создании контрольных точек.
✅ Если есть только одна последовательность обновлений, сумма должна быть просто исходной последовательностью.
Для данного осколка
[канал _changes] полностью упорядочен (осколок идентичен базе данных до 2.0 с целочисленной последовательностью), couchdb не тасует этот вывод […]
✅ Только с одним осколком [н.б. осколок , а не просто один узел / реплика ], вы в значительной степени остались с поведением базы данных до версии 2.0.