The Twelve-Factor App — принципы архитектуры современных веб-приложений от команды Heroku. Оригинал на английском, есть перевод на русский и еще 16 языков.
Все принципы просты и каждый сфорулирован в формате короткой статьи. При нормально выстроенном процессе разработки (попросту адекватно современным требованиям) многие из изложенных принципов выполняются автоматически.
Например, трудно представить, чтобы сегодня разработка велась без системы контроля версий или чтобы нарушалась связь «одно приложение (сервис) — один репозиторий».
Но соблюдение всех принципов с течением времени, в процессе эволюции продукта, роста команды и усложнения процессов — свидетельствуют о хорошем техническом управлении и правильной организации работы.
Собственно, сами принципы:
- Кодовая база. Одна кодовая база, отслеживаемая в системе контроля версий, – множество развёртываний
- Зависимости. Явно объявляйте и изолируйте зависимости
- Конфигурация. Сохраняйте конфигурацию в среде выполнения
- Сторонние службы (Backing Services). Считайте сторонние службы (backing services) подключаемыми ресурсами
- Сборка, релиз, выполнение. Строго разделяйте стадии сборки и выполнения
- Процессы. Запускайте приложение как один или несколько процессов не сохраняющих внутреннее состояние (stateless)
- Привязка портов (Port binding). Экспортируйте сервисы через привязку портов
- Параллелизм. Масштабируйте приложение с помощью процессов
- Утилизируемость (Disposability). Максимизируйте надёжность с помощью быстрого запуска и корректного завершения работы
- Паритет разработки/работы приложения. Держите окружения разработки, промежуточного развёртывания (staging) и рабочего развёртывания (production) максимально похожими
- Журналирование (Logs). Рассматривайте журнал как поток событий
- Задачи администрирования. Выполняйте задачи администрирования/управления с помощью разовых процессов
На основе The Twelve-Factor App в блоге IBM в 2019 году вышла статья «7 Missing Factors from 12-Factor Applications» (переведенный на Хабре). Авторы предлагают дополнительные 7 принципов, преимущественно в разрезе работы с Kubernetes:
- Наблюдаемость. Приложения должны предоставлять сведения о своем текущем состоянии и показателях
- Прогнозируемость. Приложения должны обеспечивать прогнозируемость ресурсных требований
- Обновляемость. Приложения должны обновлять форматы данных с предыдущих поколений.
- Минимальные привилегии. Контейнеры должны работать с минимумом привилегий
- Контролируемость. Необходимо знать что, когда, кто и где — для всех критически важных операций
- Защищенность. Необходимо защищать приложение и ресурсы от посторонних.
- Измеримость. Эксплуатация приложений должна быть измеримой для целей квотирования и финансовых расчетов
С дополнительными 7 принципами авторы статьи выступали на KubeCon 2019 в Шанхае: