2015-04-28 6 views
4

Я использовал MongooseJS revisionKey какое-то время - поле __v, которое оно включает в себя с документами, по умолчанию. Я понимаю, какова цель номера ревизии, и вообще, когда она обновляется.Является ли MongooseJS «versionKey» (поле __v) «векторными часами»?

Я недавно говорил с другом о идее «векторных часов», и я упомянул MongoDB и MongooseJS с этим полем __v. В то время это звучало так, будто это могли быть векторные часы. Но, прочитав немного о векторных часах, теперь я не уверен.

Так что мне интересно: может ли атрибут MongooseJS versionKey и поле __v, которое он производит по умолчанию, считаются векторными часами? Да или нет, и почему?

+0

Насколько я понимаю, значение 'versionKey' увеличивается только с помощью функций' save' и 'findOneAndUpdate'. Поскольку значение 'versionKey' не увеличивается, когда выполняется' update', или когда обновление вручную выполняется с помощью mongo cli, я считаю, что это не даст результата для определения векторных часов. –

+0

@BrianShamblen - вы должны опубликовать это как ответ, а не комментарий –

ответ

4

По моему мнению, вы не упомянули versionKey. Вы могли бы считать это Lamport timestamp (или Lamport Clock).

Давайте иметь глобальный взгляд на то, что мы управляем:

Оба часы лэмпорта и векторные часы являются алгоритмы, используемые для определения порядка причинно-следственных связей на различных событиях, происходящих в распределенной системе. Другими словами, оба алгоритма используются для синхронизации событий, которые не имеют общей ссылки.

Алгоритм временных меток Lamport использует один счетчик для каждого процесса (в случае вопроса мы можем сказать один счетчик для каждого документа). Алгоритм работает следующим образом:

1) Каждый раз, когда событие происходит в процессе (связь, модификация и т. Д.), Счетчик не предваряется.

2) Когда процесс отправляет сообщение другому процессу, он присваивает значение счетчика отправленному сообщению.

3) Когда процесс получает какое-либо сообщение, счетчик увеличивается (если принятое значение меньше или равно текущему значению счетчика), или значение счетчика установлено на принятое значение, если оно больше текущего стоимость.

Ниже приведен пример алгоритма применительно к трем процессам:

Lamport timestamps for three processes

часы лэмпорт предлагает один счетчик для всех процессов, что позволяет определить, какой является последней версией процесса (или документ в случае с мангустом

С учетом этого мы можем заключить, что versionKey - это механизм, который позволяет нам узнать, является ли версия, с которой мы имеем дело, текущей или мы устарели.

Как Aaron Heckmann очков в своем блоге о версионности в Мангусте (Mongoose v3 part 1 :: Versioning:.

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

Итак, из коробки, вы будете использовать только versionKey, если пытаться изменить поддокумент, что является массивом и вы меняете порядок т .

С другой стороны, Аарон утверждает, что метод increment() вручную заставляет инкремент версии документа. Если вы внедрили алгоритм Lamport, вы можете использовать этот метод для увеличения версии, соответствующей первому правилу алгоритма. В этом случае вы будете использовать versionKey как временную метку Lamport.

Таким образом (здесь идет фактический ответ на ваш вопрос). Почему versionKey не может считаться векторным часом:

  • Векторные часы используют счетчик для каждого процесса, связанного с окружающей средой. В случае с документами векторные часы должны использоваться для хранения нескольких версий одного и того же документа. Это позволяет разрешать конфликты, когда два разных документа имеют один и тот же номер версии. Поскольку versionKey является единственным значением, его нельзя считать векторным часом. DynamoDB использует векторные часы для обработки версий, here is an interesting reading about it

Вот выдержка из статьи:

Динамо использует векторные часы для захвата причинной связи между разными версиями одного и того же объекта. Векторные часы фактически представляют собой список (узел, счетчик) пар. Один векторный такт связан с каждой версией каждого объекта. Можно определить, находятся ли две версии объекта на параллельных ветвях или имеют причинную упорядоченность, исследуя их векторные часы. Если счетчики на часах первого объекта меньше или равны всем узлам во втором часе, тогда первый является предком второго и может быть забыт. В противном случае эти два изменения считаются конфликтующими и требуют согласования.

Так что я бы не стал рассматривать векторные часы versionKey, и я рассмотрю его временную метку Lamport с некоторыми обходными решениями.

2

Я полагаю, что значение versionKey только увеличивается от save и findOneAndUpdate функций. Поскольку значение versionKey не увеличивается, когда выполняется update, или когда обновление вручную выполняется с помощью mongo cli, я считаю, что это не даст результата для определения векторных часов.

+0

Значение увеличивается, когда операция над массивом потенциально изменяет положение элемента массива. Эти операции: $ pull $ pullAll $ pop $ набор всего массива (извлечение из блога Аарона Хекмана об управлении версиями с помощью Mongoose) – javierfdezg