Поддерживает ли fluid-framework транзакции?

#fluid-framework

#fluid-framework

Вопрос:

Например, в FluidFramework/examples/data-objects/badge/src/BadgeClient.tsx:

     const changeSelectedOption = (newItem: IBadgeType): void => {
        if (newItem.key !== model.currentCell.get().key) {
            const len = model.historySequence.getItemCount();
            model.historySequence.insert(len, [
                {
                    value: newItem,
                    timestamp: new Date(),
                },
            ]);
            model.currentCell.set(newItem);
        }
    };
  

Всегда ли операция вставки истории выполняется успешно / завершается неудачей вместе с операцией настройки ячейки?

Комментарии:

1. Локальное изменение состояния, вероятно, будет атомарным. Но, скажем, две операции отправляются по сети, и одна из них не поступает на сервер, тогда что произойдет с другими клиентами?

Ответ №1:

Не транзакции, но он поддерживает пакеты. Пакеты гарантируют, что никакие другие операции не будут чередоваться между операциями в пакете. Вы можете создать пакет, используя orderSequentially Api

Ответ №2:

Fluid не поддерживает транзакции в традиционном смысле, но у Fluid есть «групповые операции». Они могут быть созданы с помощью orderSequentially api в ContainerRuntime. Некоторые DDS имеют оболочку вокруг этого API уровня контейнера.

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

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

Вы можете увидеть пример в последовательности DDS.

Ниже мы отправим две операции для «hello» и «world» в одной групповой операции, гарантируя, что helloworld будет отправлен сразу без чередования ввода.

 const op1 = {
    pos: 0,
    seg: "hello",
    type: MergeTreeDeltaType.INSERT,
}

const op2 = {
    pos: 5,
    seg: "world"
    type: MergeTreeDeltaType.INSERT,
}

const groupOp = {
    ops: [op1, op2],
    type: MergeTreeDeltaType.GROUP,
}

sharedString.groupOperation(groupOp);

  

Объект ProseMirror fluid содержит более подробный код

Комментарии:

1. Спасибо, Сэм! Один дополнительный вопрос: похоже, groupOperation() применяется только к одной и той же общей последовательности. Означает ли это, что невозможно принудительно изменить транзакцию 2 разных объекта? Или, может быть, я могу изменить сервер, чтобы включить эту функцию?

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