Anton Sidorov homepage

Bookmark this to keep an eye on my project updates!

Follow me on GitHub

Рефакторинг БД

Паттерны распила монолита на MSA

Зачем

Часть рефакторинга монолита.

Паттерны

Вопросы:

  • Выделен DAL, есть адаптер до БД, исп-ся паттерн Репозиторий?
  • Анализ в коде зависимости View, SP, trigger от таблиц
    • проблема: использование шаблона shared database. Данные брались из таблиц через view, через интеграцию загружались в другие ИС. В результате мы не могли выносить таблицы в отдельную схему, потому что они активно использовались.

Паттерны БД

Схема

Паттерны рефакторинга схемы базы данных:

  • Разделить данные по признаку Сущности, например: Новый клиенты в НС, повторные в монолите
    • плюысы: не требуется реализации миграции данных
    • минусы: синхронизация в монолит потребуется, для возможности отката НС при итеративном распиле
  • отделение существующих таблиц
    • переносятся как есть в НС (антипаттерн?)
    • отделение таблиц с рефакторингом
      • Паттерн «разделение таблицы» (split table), который разбивает одну таблицу на две или больше
        • 1м этапом в той же БД, тесты
        • 2м - в новой БД сервиса
  • Разделить операции чтения\изменения данных (CQRS)
    • Операции изменения в 1ю очередь в новый сервис
    • Операции чтения во 2ю очередь
      • Снижает изменения интеграций со смежными ИС потребителями данных на чтение
      • Необходима миграция текущих данных в новый сервис
      • TODO Синонимы в БД?
  • Паттерн “Совместное использование БД” несколькими сервисами
    • минусы: нет сокрытия и изоляция данных, размыто понимание какой сервис какими данными владеет
    • подходит для:
      • статических справочных данных для чтения
      • БД для интеграция нескольких внешних ИС потребителей
  • Паттерн “Представления (проекции view) БД” для внешних ИС потребителей
    • минусы: единое ядро СУБД между ИС как правило необходимо, иначе проблемы совместимости, скорости (MSSQL2PgSQL и тп)
  • Паттерн “Сервис обертки над БД” (database wrapping service)
    • подходит где сложно разобрать быстро модель БД, поэтому замораживается развитие БД, все изменения через Сервис
      • контроль, что скрыто в модели от потребителей
    • минусы: “повязка” временная для постепенного рефакторинга модели БД
  • Паттерн “Интерфейс БД как служба”
    • Основная БД отображается на отдельную БД на чтение для внешних ИС потребителей
      • механизм отображения:
    • Изменения в основной БД происходят через API
    • подходит для: отчетности
    • минусы: доп расходы на отдельную БД и механизм отображения
      • альтернатива: реплика полная БД, но сокрытия нет и ИС потребители сами следят за изменениями модели БД
    • Отличие от Паттерна “Представления БД” - отдельная БД может быть на другом тех стеке
  • Писать в обе БД (2 источника истины), чтение только из новой БД
    • Механизмы сверки данных необходимы
    • Устранение двойной записи - шаблон Outbox вместе с Debezium, можно сделать так, что сервисы будут выполнять обе задачи – обновлять данные и уведомлять другие сервисы – безопасно и согласованно.