Skip to content

Versioning

Gennady Lebedev edited this page Sep 26, 2020 · 2 revisions

Tx, Commit, Rollback

Веросионирование в рудиментах является надстройкой над хранилищем агрегатов:

  • в приложении или на уровне адаптера запрашивается Tx - специальный Context, содержащий идентификатор транзакции и ее захваченные ресурсы. Внутри так же можно хранить дельту изменений (пригодится для пропагации в разных режимах доступа к Tx, как локальный кэш), признаки верификации.
  • Commit является событием, признаком что изменения закончены, хранит в себе существенную часть данных из Tx
  • Rollback является командой, которая откатывает конкретный коммит - откатывает изменения во внешних системах, проверяет текущее состояние в данных до и после отката.
  • откат транзакции - это освобождение ресурсов, откат сохраненных во внешних системах данных, удаление самой транзакции

Система версионирования является надстройкой над транзакциями:

  • коммиты и транзакции, свернутые в состояние - конкретная версия системы
  • модули, которые содержат свое состояние и умеют пропагировать вызовы в другие модули (Tx, другие версии) - надстройки, компактней полноценной версии системы и имеют зависимость. Надстройки - аналог бранчей, реализующие разные фильтры над потоком коммитов.

Recons

Реконсиляция - процесс примирения. В рудиментах - примирение наборов данных, когда понятно их расхождение (дельта).

Результат реконсиляции не симметричен (правильный термин нужно найти) относительно аргументов "кого с кем примиряем", но есть функция reverse(), которая меняет результат как если бы аргументы поменялись местами.

Реконс коллекции

Структура Index[ID, Instance] позволяет сравнивать 2 инстанса по ID. Возможны 4 результата для реконсиляции из A в R:

  • Identical - запись есть в A и R, и они обе идентичны по составу
  • Created - запись отсутствует в A, но есть в R
  • Updated - запись есть в A и R, но с разным контентом
  • Deleted - запись есть в А, но не в R
  • Impossible - нет ни в A, ни в R. Код требует для полного перебора switch-case, но эта ветка никогда не будет посещена при итерации по 2 Index[ID, Instance]

Таким образом на выходе будет Commit(values: Map[ID, DataEvent], events: Seq[Event]).

Реконс по истории

История изменений в виде DataCommand сама по себе может быть преобразована в Commit, это наиболее правильный вариант реконсиляции. При реконсиляции по истории можно формировать схлопнутый (squashed) Commit, в случае нескольких изменений сущности останется только одно композитное.

Реконс инстанса, Patch

Вместо Update можно делать потенциально более компактную форму:

  • Update(ID, newValue) -> Patch(ID, newΔ)
  • Updated -> Patched(ID, oldΔ, newΔ) Δ - Map[String, Any]. При генерации можно рекурсивно применять патч к композитным полям.

Clone this wiki locally