Сценарий 11: Анализ архитектуры

Сценарий 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()            - Блокировка кортежа               │
│                                                             │
╰─────────────────────────────────────────────────────────────╯

Примеры вопросов

  • «Отобразить архитектуру системы»
  • «Показать зависимости между слоями»
  • «Найти использованные шаблоны проектирования»
  • «Обнаружить нарушения архитектуры»
  • «Проанализировать связность модулей»
  • «Показать публичные интерфейсы [модуля]»