Могут ли события изменений MongoDB считаться уникальными?

Описание

I am utilizing the MongoDb change stream (C# MongoDB.Driver v2.12.0) to track changes on a single collection. In an experimental use case the collection stores information about execution of threads.

У потока есть два свойства:

  • Status - РАБОТАЕТ, ЗАБЛОКИРОВАНО или ЗАВЕРШЕНО
  • BlockedCount - количество блокирующих потоков

Во время своего выполнения поток может порождать дочерние потоки и блокироваться до тех пор, пока все дочерние потоки не будут завершены. Каждый раз, когда дочерний поток завершает свое выполнение, он обновляет базу данных, уменьшая BlockedCount родительского. Как только BlockedCount упадет до 0, родительский поток должен продолжить выполнение.

Код для подписки на смену потока:

var pipeline = new EmptyPipelineDefinition<ChangeStreamDocument<T>>()
                    .Match(change => change.OperationType == ChangeStreamOperationType.Insert ||
                                     change.OperationType == ChangeStreamOperationType.Update ||
                                     change.OperationType == ChangeStreamOperationType.Replace)
                    .AppendStage<ChangeStreamDocument<T>, ChangeStreamDocument<T>, ChangeStreamOutputWrapper<T>>(
                                     "{ $project: { '_id': 1, 'fullDocument': 1, 'ns': 1, 'documentKey': 1 }}");

var options = new ChangeStreamOptions
{
    FullDocument = ChangeStreamFullDocumentOption.UpdateLookup
};

using (var cursor = await coll.WatchAsync(pipeline, options, cancellationToken))
{
    await cursor.ForEachAsync(async change =>
    {
        // await some handler routine
    }, cancellationToken);
}

Проблема

What I have noticed is that the change events can be different even if the update operations are exactly the same. To better explain this, here is an example:

Есть 1 родительский поток и 3 дочерних потока, завершающих свое выполнение, наблюдаются два разных поведения:

  • 3 различных события обновления для родительского потока:

    • "Status" : "BLOCKED", "BlockedCount" : 2
    • Статус: ЗАБЛОКИРОВАН, Заблокировано Количество: 1
    • Статус: ЗАБЛОКИРОВАНО, Заблокировано Количество: 0
  • 3 идентичных события обновления для родительского потока:

    • "Status" : "BLOCKED", "BlockedCount" : 0
    • Статус: ЗАБЛОКИРОВАНО, Заблокировано Количество: 0
    • Статус: ЗАБЛОКИРОВАН, Заблокировано: 0

Вопросов

  1. Считается ли это нормальным поведением?
  2. Есть ли какая-то конфигурация, которая предотвратит это и запустит только «последнее» обновление?

person ivanpovazan    schedule 11.05.2021    source источник


Ответы (1)


Да, это ожидаемое поведение. В документации (ссылка) указано, что:

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

И, насколько мне известно, это поведение невозможно преодолеть или отрегулировать. Однако вы можете просто читать updateDescription напрямую, отслеживая изменения вручную. Это не будет сложно, если BlockedCount только устанавливается (т.е. не удаляется и не добавляется позже).

person Radosław Miernik    schedule 11.05.2021