Good system design 🔥 Горячее 💬 Длинная дискуссия
Всё, что я знаю о хорошем системном дизайне
Системный дизайн — это то, как мы собираем сервисы, а не строки кода. Его примитивы: серверы, БД, кэши, очереди, прокси и т.д.
Хороший дизайн выглядит скучно: ничего не ломается, задачи решаются проще, чем ожидалось. Сложные системы с CQRS, консенсусом и прочими фокусами часто компенсируют плохие решения. Сложное должно расти из простого, а не строиться сразу.
Состояние и его минимизация
Сложность — в управлении состоянием. Stateless-сервисы (например, конвертер PDF → HTML) перезапускаются и живут вечно. Stateful-сервисы могут «испортиться» и требуют ручного лечения. Поэтому:
- Один сервис пишет в БД, остальные общаются с ним по API/событиям.
- Чтение иногда проще делать напрямую, но писать — только через «владельца» данных.
Базы данных
Главный компонент.
- Схема: читаемая человеком, достаточно гибкая, но не «всё в JSON».
- Индексы: под самые частые запросы, не больше.
- Узкие места: обращения к БД часто тормозят всё.
Комментарии (348)
- Сложность ≠ хороший дизайн: большинство участников согласны, что переусложнённые системы часто свидетельствуют о слабом проектировании, но на собеседованиях это лучше не озвучивать.
- Главный критерий — пригодность (fit for purpose): универсальных «правильных» архитектур не существует, нужно исходить из задач команды и бизнеса.
- Простота и KISS ценятся выше модных паттернов; монолит или «скучные» технологии часто эффективнее микросервисов и самописных очередей.
- Ключевые боли — синхронизация состояний и транзакционность между сервисами; чем меньше распределённого состояния, тем проще жить.
- Не забывать людей: Conway’s Law и топология команд влияют на архитектуру не меньше, чем технические решения.