Сложное CRUD-приложение

Сложное CRUD-приложение

Сложное CRUD-приложение — это приложение, в котором бизнес-требования часто выглядят «простыми CRUD-операциями», но сложность разработки и сопровождения определяется не доменными инвариантами, а моделью данных, эффектами (IO) и интеграциями.

Такие системы обычно не требуют экзотических технологий: REST/JSON, реляционная БД, несколько внешних сервисов. И при этом они систематически «перерастают» в код, где трудно предсказать последствия изменений.

Признаки

  1. Большая модель данных: десятки/сотни типов сущностей, много связей, много полей.

  2. «Простые» Create/Update/Delete операции затрагивают десятки таблиц и несколько внешних систем.

  3. Нефункциональная сложность доминирует над предметной:

    1. маппинг внешних структур данных на внутренние;

    2. эффективность IO (батчи, параллелизм, кэширование);

    3. обработка частичных отказов и деградация (показать «что есть», но отметить ошибку).

  4. По коду сложно быстро ответить на вопросы:

    1. какие эффекты (БД/HTTP/очереди/почта/файлы) будут выполнены;

    2. сколько IO-вызовов произойдёт;

    3. где границы графа объектов, который создаётся/читается/модифицируется.

Пример: Страница расписания в Trainer Advisor

Операция отображения страницы расписания терапевта звучит как «простой CRUD» сценарий:

  1. взять данные о приёмах из БД;

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

  3. свести всё в календарную сетку;

  4. если произошёл сбой при загрузке данных — вывести доступные данные и явно обозначить частичную ошибку;

  5. для Google Calendar — выполнять загрузку данных параллельно, чтобы сократить время ожидания пользователя.

Но структурная диаграмма (граф вызовов методов) реализации этой операции не является простой:

ta schedule call graph
Figure 1. Пример графа вызовов «простой» операции

Этот кейс показателен тем, что сложность возникает не из-за «глубокой предметной области», а из-за:

  1. маппинга внешних моделей на внутренние;

  2. эффективности IO;

  3. обработки ошибок и частичных отказов.

Разбор реализации и контекст: Trainer Advisor — интеграция с Google Calendar.