Сценарий 11: Анализ архитектуры¶
Программный архитектор изучает и документирует архитектуру системы.
Содержание¶
- Быстрый старт
- Сопоставление подсистем
- Обзор модулей
- Зависимости между уровнями
- Обнаружение шаблонов
- Используемые шаблоны проектирования
- Нарушения архитектуры
- Анализ компонентов
- Связность модулей
- Анализ интерфейсов
- Примеры вопросов
- Связанные сценарии
Быстрый старт¶
# Выберите сценарий архитектуры
/select 11
Сопоставление подсистем¶
Обзор модуля¶
> Архитектурная схема PostgreSQL
╭────────────── Обзор архитектуры ────────────────────────────╮
│ │
│ Архитектура подсистем PostgreSQL: │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Клиентский уровень │ │
│ │ libpq, JDBC, ODBC, psql │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Уровень протокола │ │
│ │ PostgresMain, pqcomm, auth │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Уровень обработки запросов │ │
│ │ Парсер → Анализатор → Планировщик → Исполнитель │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Уровень хранения │ │
│ │ Буферный менеджер → Доступ к куче/индексам → Файловый менеджер │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
╰──────────────────────────────────────────────────────────────╯
Зависимости между уровнями¶
> Зависимости между архитектурными уровнями
╭────────────── Зависимости уровней ──────────────────────────╮
│ │
│ Направление зависимостей (сверху вниз): │
│ │
│ Протокол │
│ └── Обработка запросов │
│ ├── Хранение │
│ │ ├── Буферный менеджер │
│ │ ├── Менеджер блокировок │
│ │ └── Менеджер транзакций │
│ └── Каталог │
│ └── Хранение │
│ │
│ Пересекающиеся компоненты (общие для всех уровней): │
│ - Управление памятью (все уровни) │
│ - Обработка ошибок (все уровни) │
│ - Ведение логов (все уровни) │
│ │
╰──────────────────────────────────────────────────────────────╯
Обнаружение шаблонов¶
Используемые шаблоны проектирования¶
> Найти шаблоны проектирования в кодовой базе
╭─────────────── Шаблоны проектирования ─────────────────────────────╮
│ │
│ Обнаруженные шаблоны проектирования: │
│ │
│ Шаблон Стратегия (Strategy Pattern): │
│ - Методы доступа (heap, btree, hash, gin, gist) │
│ - Типы сканирования (последовательное, по индексу, bitmap) │
│ │
│ Шаблон Наблюдатель (Observer Pattern): │
│ - Система срабатывания событий │
│ - Механизм хуков (хуки исполнителя, хуки планировщика) │
│ │
│ Шаблон Фабрика (Factory Pattern): │
│ - Создание узлов (makeNode, copyObject) │
│ - Создание контекста памяти │
│ │
│ Шаблон Одиночка (Singleton Pattern): │
│ - Сегменты общей памяти │
│ - Кэш системных каталогов │
│ │
│ Шаблон Итератор (Iterator Pattern): │
│ - Итерация по узлам исполнителя (ExecProcNode) │
│ - Итерация при сканировании кучи │
│ │
╰───────────────────────────────────────────────────────────────────╯
Нарушения архитектуры¶
> Найти нарушения архитектурных шаблонов
╭─────────────── Нарушения архитектуры ─────────────────────╮
│ │
│ Нарушения границ слоёв: │
│ │
│ 🔴 Прямой доступ к файлам из исполнителя │
│ Расположение: src/backend/executor/nodeCustom.c:234 │
│ Проблема: Обход диспетчера буферов │
│ Исправление: Использовать ReadBuffer() вместо прямого чтения │
│ │
│ 🟡 Доступ к каталогам без надлежащей блокировки │
│ Расположение: src/backend/utils/cache/relcache.c:567 │
│ Проблема: Возможна гонка за ресурсами │
│ Исправление: Добавить LockRelationOid() перед доступом │
│ │
│ Циклические зависимости: │
│ оптимизатор ↔ исполнитель (3 места) │
│ │
│ Всего нарушений: 5 │
│ │
╰───────────────────────────────────────────────────────────╯
Анализ компонентов¶
Связность модулей¶
> Анализ связности модуля executor
╭─────────────── Анализ связности ───────────────────────────╮
│ │
│ Модуль: src/backend/executor/ │
│ │
│ Оценка связности: 78% (Хорошо) │
│ │
│ Подкомпоненты: │
│ execMain.c - Точки входа (Высокая связность) │
│ execProcnode.c - Диспетчеризация узлов (Высокая связность)│
│ execQual.c - Оценка условий (Высокая связность) │
│ execUtils.c - Вспомогательные функции (Средняя связность)│
│ │
│ Возможности для улучшения: │
│ - Разделить execUtils.c на более узкие модули │
│ - Выделить параллельное выполнение в отдельный модуль │
│ │
╰─────────────────────────────────────────────────────────────╯
Анализ интерфейсов¶
> Показать публичные интерфейсы уровня хранения
╭─────────────── Публичные интерфейсы ────────────────────────╮
│ │
│ Публичное API уровня хранения: │
│ │
│ Менеджер буферов (bufmgr.h): │
│ ReadBuffer() - Чтение страницы в буфер │
│ ReleaseBuffer() - Освобождение блокировки буфера │
│ MarkBufferDirty() - Пометка на запись │
│ FlushBuffer() - Запись на диск │
│ │
│ Доступ к куче (heapam.h): │
│ heap_insert() - Вставка кортежа │
│ heap_delete() - Удаление кортежа │
│ heap_update() - Обновление кортежа │
│ heap_fetch() - Получение кортежа по TID │
│ │
│ Менеджер блокировок (lmgr.h): │
│ LockRelation() - Блокировка отношения │
│ UnlockRelation() - Снятие блокировки отношения │
│ LockTuple() - Блокировка кортежа │
│ │
╰─────────────────────────────────────────────────────────────╯
Примеры вопросов¶
- «Отобразить архитектуру системы»
- «Показать зависимости между слоями»
- «Найти использованные шаблоны проектирования»
- «Обнаружить нарушения архитектуры»
- «Проанализировать связность модулей»
- «Показать публичные интерфейсы [модуля]»
Связанные сценарии¶
- Введение в систему — Первичное ознакомление
- Документация — Генерация архитектурной документации
- Межрепозиторный анализ — Анализ нескольких репозиториев
- Разработка функций — Понимание кода для разработки