Сложные системы
Система становится сложной не просто из-за большого числа компонентов. Важнее нелинейные связи, память, задержки, обратные связи и самостоятельное поведение частей. Из-за них небольшое изменение входа иногда даёт непропорциональный результат.
Признаки
- много типов элементов и связей;
- несколько уровней организации;
- конкурирующие цели участников;
- задержки между причиной и наблюдаемым эффектом;
- вероятностное поведение;
- адаптация к среде;
- эмерджентные свойства;
- невозможность полностью наблюдать состояние.
Микросервисная архитектура может быть технически большой, но предсказуемой. Небольшая система с циклическими зависимостями и обратной связью может оказаться сложнее.
Системный подход
- Исследовать результат целого, а не только исправность деталей.
- Явно обозначать границы и внешнюю среду.
- Смотреть на потоки и связи, а не только на список компонентов.
- Учитывать несколько масштабов времени: запрос, релиз, рост нагрузки.
- Проверять побочные эффекты локальной оптимизации.
Декомпозиция и координация
Декомпозиция уменьшает объём рассуждения: выделяем подсистемы по ответственности, данным или темпу изменения.
Координация задаёт правила совместной работы: контракты, порядок событий, владение данными, обработку отказов.
flowchart LR A["Входной поток"] --> B["Подсистема A"] B --> C["Подсистема B"] C --> D["Результат"] C -- "сигнал перегрузки" --> B
На схеме нельзя оптимизировать A без проверки B: ускоренный выпуск из A способен перегрузить B и ухудшить общий результат.
Как исследовать
- структура — граф компонентов и связей;
- поведение — траектории состояния;
- неопределённость — сценарии и распределения;
- нагрузка — Теория массового обслуживания;
- варианты устройства — Элементы структурного анализа агрегативных систем;
- выбор решения — Оптимизация сложных систем.
Самопроверка
- По каким признакам отличить сложность от большого размера?
- Почему локальное снижение задержки может увеличить задержку всей системы?
- Что теряется при декомпозиции и чем это компенсировать?