-
Notifications
You must be signed in to change notification settings - Fork 0
Versioning
Веросионирование в рудиментах является надстройкой над хранилищем агрегатов:
- в приложении или на уровне адаптера запрашивается
Tx- специальныйContext, содержащий идентификатор транзакции и ее захваченные ресурсы. Внутри так же можно хранить дельту изменений (пригодится для пропагации в разных режимах доступа к Tx, как локальный кэш), признаки верификации. -
Commitявляется событием, признаком что изменения закончены, хранит в себе существенную часть данных из Tx -
Rollbackявляется командой, которая откатывает конкретный коммит - откатывает изменения во внешних системах, проверяет текущее состояние в данных до и после отката. - откат транзакции - это освобождение ресурсов, откат сохраненных во внешних системах данных, удаление самой транзакции
Система версионирования является надстройкой над транзакциями:
- коммиты и транзакции, свернутые в состояние - конкретная версия системы
- модули, которые содержат свое состояние и умеют пропагировать вызовы в другие модули (Tx, другие версии) - надстройки, компактней полноценной версии системы и имеют зависимость. Надстройки - аналог бранчей, реализующие разные фильтры над потоком коммитов.
Реконсиляция - процесс примирения. В рудиментах - примирение наборов данных, когда понятно их расхождение (дельта).
Результат реконсиляции не симметричен (правильный термин нужно найти) относительно аргументов "кого с кем примиряем", но есть функция 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, но эта ветка никогда не будет посещена при итерации по 2Index[ID, Instance]
Таким образом на выходе будет Commit(values: Map[ID, DataEvent], events: Seq[Event]).
История изменений в виде DataCommand сама по себе может быть преобразована в Commit, это наиболее правильный вариант реконсиляции.
При реконсиляции по истории можно формировать схлопнутый (squashed) Commit, в случае нескольких изменений сущности останется только одно композитное.
Вместо Update можно делать потенциально более компактную форму:
-
Update(ID, newValue)->Patch(ID, newΔ) -
Updated->Patched(ID, oldΔ, newΔ)Δ - Map[String, Any]. При генерации можно рекурсивно применять патч к композитным полям.