12 факторов: вступление
Программное обеспечение, как и многое, что окружает нас в жизни — подвластно веяниям моды. Человечество мигрирует между технологиями (иногда по кругу), отделяет и детерминирует правильное от неправильного; и от «на сегодняшний день уже нельзя». Программы живут всё меньше времени и все последние годы стремятся к декомпозиции. На сцену вышли микросервисы и все последние годы только и разговоров что о них. Вкратце, речь, конечно идёт о SaaS (software as service; программное обеспечение как сервис) и\или микросервисах SOA (service oriented architecture; сервисно-ориентированная архитектура) — особый вид программ, вычлененных логически и инфраструктурно из общего целого, занимающиеся своей личной не широкой и консистентной ответственностью. Модульный, распределённый подход к построению логических цепочек, пользовательского пути (flow) и т.д.
Как и во всём, конечно, существуют примеры грамотной и некачественной реализации. Человечество набивает шишки, получает драгоценный опыт, конденсирует его в best practice, забывает и совершает какой-либо другой новый виток. Микросервисы — мода последних лет, конечно, не стала исключением. Десятки тысяч разработчиков по крупице, по микрону агрегировали в кучу свои знания, синтезировали, выкристаллизовывали, обтачивали и гравировали опыт. Результатом этой работы стали 12 заповедей правил, которыми следует придерживаться для наиболее оптимизированного и грамотного подхода не только к разработке программы, но и в разворачивании и поддержке. Отмечу также, что, наверное, впервые заговорили о инфраструктуре, о профессии devops.
Все нижеописанные факторы будут рассмотрены мной итеративно и отдельно. Сейчас же, вместо содержания, хочу вам рассказать о всех 12 факторах двенадцатифакторного приложения 🙂
Двенадцать факторов:
- Кодовая база — единое место хранения исходный кодов вашего сервиса, хранящиеся в системе контроля версий. Принцип одно к многому: один код может быть развернут как угодно, кем угодно и где угодно;
- Зависимости — явно указанные пакеты зависимостей, изолированные, использующие, как правило, семантическое версионирование SemVer;
- Конфигурирование — вся гибкость и динамичность вашего программного обеспечения, должна хранится и редактироваться в среде исполнения при помощи переменных окружения;
- Сторонние службы — то, с чем мы взаимодействуем непосредственно — любые доступные внутри сети внешние приложения, к примеру, базы данных, системы кэша, очереди сообщений и т.д.;
- Сборка, деплой в релиз, runtime — жизненный цикл стадии развёртывания ваших микросервисов или SaaS-систем;
- Процессы — подразумевается использования state-независимых системы (stateless);
- Биндинг портов — экспорт портов наружу сервиса через привязку (binding);
- Параллелизм — возможность масштабировать приложения «в ширину», безболезненный подъём нескольких экземпляров программ без потерь в работоспособности;
- Готовность к уничтожению (Dispose/Disposable/Disposability) — гарант работоспособности, валидности и консистентности данных даже в условиях грубой остановки приложения, включая и уничтожение самого потока\процесса выполнения;
- Паритет развёртывания — в 12 факторных приложениях желательно держать свой рабочий environment (среду), development, staging и production версии максимально идентичными и равными между собой;
- Логирование — использование лога, как машину времени — поток событий, который, в последствии, может стать и дебагером, и timeline state машиной. Любое логирование даёт облегчённый способ понять о текущем и прошедшем состоянии приложения;
- Задания администрирования — в развёртывании, разработки часто приходится работать с периодическими, как правило, детерминированными/отдельными задачами. К примеру, запуск миграции данных (в обе стороны), запуск каких-либо воркеров/работ и т.д..
Конечно, это очень приблизительное описание того, чем является «Двенадцатифакторное приложение«. В следующих записях я постараюсь рассмотреть как можно более подробно каждый из пунктов (хотя, положа руку на сердце, даже этого тезисного описания должно хватить для понимания общей картинки данной концепции и методологии).