Как стать автором
Обновить

Гарантия консистентности двух и более состояний

Уровень сложностиСложный
  1. Статья

    1. описывает проблему гарантии полноты и неизбыточности при последовательной установке двух состояний;

    2. выдвигает гипотезу о невозможности разрешения проблемы без участия состояний (без идемпотентности состояний);

    3. предлагает Общее решение.

Задача

  1. Поток T должен установить два состояния S1 и S2.

  2. S1 и S2 возвращают синхронный ответ при успехе сохранения и не более.

  3. Требуется гарантировать полноту и не избыточность установки состояний.

Проблема

  1. Поток Т выполняет запись в S1.

    1. При провале поток Т возвращает отказ.

    2. При успехе поток Т должен выполнить запись в S2.

      1. Начиная с этого момента возникает проблема неопределенности при ошибке установки S2 или крахе потока Т.

        1. состояние S1 уже установлено, а S2 не установлено;

        2. однозначно не определен результат исполнения потока T;

        3. повторный вызов потока Т не разрешит ситуацию.

Гипотеза

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

  2. Никакие механизмы со стороны Т не могут разрешить указанную проблему без идемпотентности S1.

Варианты решения

  1. Состояние S1 должно быть идемпотентным например:

    1. защита от дублированного получения данных;

    2. возможность оповещения T по его инициативе о результатах сохранения.

  2. T должен обладать возможностью повтора установки состояний при отказе.

Общее решение гарантии консистентности состояний

  1. Ниже перечислены рассматриваемые виды состояний:

    1. S - (simple state) простое состояние без поддержки транзакций и идемпотентности, например:

      1. очереди сообщений (kafka, итд);

      2. внешние сервисы;

      3. базы без идемпотентных проверок, с триггерами или автокоммитом;

      4. журналирование.

    2. I - (idempotent state) - состояние с поддержкой идемпотентности:

      1. базы данных;

      2. сервисы;

      3. файлы.

    3. T - (transact state) - состояния, поддерживающие транзакционную целостность.

      1. базы данных TSQL.

Таблица возможных комбинаций

  1. Таблица демонстрирует:

    1. возможные комбинации последовательной установки состояний в синхронном потоке;

    2. гарантию итоговой консистентности для различных вариантов;

    3. последствия сбоя в потоке между установкой состояний.

  2. Обязательным условием является повтор вызова потока пр отказе на любой стадии.

    1. пример:

      1. Поток получает сообщение из очереди, которая гарантирует повторяемость.

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

Состояния

Гарантия

Пример

Негативные последствия

SS

нет

Push сообщения в очередь; Write в журнал

Накопление дублей сообщений в очереди

SI

нет

Commit сообщения очереди; Идемпотентный вызов сервиса

Отсутствие вызова сервиса

ST

нет

Commit сообщения очереди; Insert в базу

Накопление дублей сообщений в очереди

IS

да

Insert с предпроверкой в базу; Commit сообщения очереди

Многократные попытки Insert

II

да

Insert с предпроверкой в базу; Update с предпроверкой в базу

Многократные попытки Insert

IT

да

Вызов внешнего сервиса; Запись в базу

Многократный вызов внешнего сервиса

TS

нет

Insert в базу; Push в очередь

Накопление дублей в БД

TI

нет

Insert в базу; Запись с предпроверкой в базу

Накопление дублей в БД

TT

да

Insert в базу; Запись в базу в одной транзакции

Полный откат транзакции

Общие правила гарантии сохранения состояний

  1. Повторяемость вызова при любом отказе в потоке

    1. И идемпотентность предыдущего изменения состояния

      1. ИЛИ изменение всех состояний в единой транзакции.

Ccылки

  1. Статья на github

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.