Застосунок дванадцяти факторів (англ. Twelve-Factor App, 12 factor) — це методологія для створення SaaS-застосунків, які:
- Використовують декларативний формат для автоматизації встановлення та налаштування, що зводить до мінімуму витрати часу і коштів для нових розробників, що приєднуються до проекту;
- Мають угоду з операційною системою, пропонуючи максимальну переносимість між ;
- Придатні для розгортання на сучасних хмарних платформах, що усуває необхідність у серверах та їх системному адмініструванні;
- Мінімізують різницю між середовищем розробки і production середовищем, що дозволяє безперервне розгортання для забезпечення максимальної спритності розробки (agility);
- Можуть масштабуватися без значних змін в інструментах, архітектурі і практиці розробки.
Методологію дванадцяти факторів можна використати для застосунків, що написані будь-якою мовою програмування та використовують будь-яку комбінацію із сторонніх служб (бази даних, черги, кеш-пам’ять тощо).
Дванадцять факторів
# | Фактор | Опис |
---|---|---|
I | Кодова база | Одна кодова база, що відслідковується в системі контролю версій та має багато розгортань. |
II | Залежності | Явно оголошуйте та ізолюйте залежності. |
III | Конфігурація | Зберігайте конфігурацію в середовищі виконання. |
IV | Сторонні служби | Вважайте сторонні служби (backing services) підключеними ресурсами. |
V | Збірка, реліз, виконання | Суворо відокремлюйте етапи збірки та виконання. |
VI | Процеси | Запускайте застосунок як один або декілька процесів без збереження внутрішньго стану (stateless). |
VII | Прив’язка портів | Експортуйте сервіси за допомогою прив’язки портів (port binding). |
VIII | Конкурентність | Масштабуйте застосунок за допомогою процесів |
IX | Утилізовуваність | Підвищуйте надійність за допомогою швидкого запуску і коректного вимкнення. |
X | Dev/prod паритет | Усі середовища (development, staging, production, тощо) мають бути максимально ідентичними між собою. |
XI | Журналювання | Сприймайте журналювання (logs) як потоки подій. |
XII | Задачі адміністрування | Виконуйте задачі адміністрування/керування за допомогою разових процесів. |
Детальний опис
I. Кодова база
Застосунок дванадцяти факторів завжди відслідковуються в системі контролю версій, такій як Git, Mercurial або Subversion. Копія бази даних відстеження ревізій називається репозиторій коду (code repository), що часто скорочується до code repo або просто repo.
Кодова база — це один репозиторій (в централізованих системах контролю версій, як Subversion), або декілька репозиторіїв, які мають спільний початковий комміт (в децентралізованих системах контролю версій, як Git).
Одна кодова база — багато розгортань
Завжди існує однозначна відповідність між кодовою базою і застосунком:
- За наявності кількох баз коду, це не застосунок, це — розподілена система. Кожен компонент в розподіленій системі є застосунком, і кожен з них може окремо дотримуватися дванадцяти факторів.
- Кілька різних застосунків, що спільно використовують загальну базу коду, є порушенням дванадцяти факторів. Рішенням в даній ситуації є виділення загального коду в бібліотеки, які можуть бути підключені через менеджер залежностей.
Існує тільки одна кодова база для кожного застосунку, але може бути багато розгортань одного і того самого застосунку. Розгортанням є запущений екземпляр застосунку. Це, як правило, production-сайт і один або більше staging-сайтів (проміжних розгортань). Крім того, розробник має копію застосунку, запущеного в його локальному середовищі розробки. Кожну з таких копій також можна кваліфікувати як розгортання.
Кодова база має бути єдина для всіх розгортань, хоча в кожному розгортанні можуть бути активні різні її версії. Наприклад, розробник може мати деякі зміни у коді, які ще не додані в staging-розгортання; staging-розгортання може мати деякі зміни, які ще не додані в production-розгортання. Але всі вони використовують одну і ту саму кодову базу, таким чином можна їх ідентифікувати як різні розгортання одного і того ж застосунку.
II. Залежності
Більшість мов програмування мають системи пакунків для розповсюдження бібліотек, такі як CPAN для Perl або для Ruby. Бібліотеки, встановлені через систему пакунків, можуть бути доступними для всієї системи (так звані “site-packages”) або встановлені в каталог застосунку (так звані “vendoring” або “bundling”).
Застосунок дванадцяти факторів ніколи не залежить від неявно існуючих, досупних всій системі пакунків. Застосунок повно і точно вказує всі свої залежності за допомогою маніфесту оголошення залежностей. Крім того, він використовує інструмент ізоляції залежністей під час виконання, щоб гарантувати, що ніякі неявні залежності не “просочилися” з зовнішньої системи. Повна і явна специфікація залежностей використовується однаково як при розробці, так і в production.
Наприклад, Bundler в Ruby використовує як формат маніфесту для оголошення залежностей і bundle exec для ізоляції залежностей. У Python є два окремі інструменти для цих задач - Pip використовується для оголошення і Virtualenv для ізоляції. Навіть C має для оголошення залежностей, а статичне зв’язування може забезпечити ізоляцію залежностей. Який би не використовувався набір інструментів, оголошення і ізоляція залежностей завжди мають використовуватися разом — тільки одне або інше не є достатньою умовою для задоволення дванадцяти факторів.
Однією з переваг явного оголошення залежностей є те, що це спрощує налаштування застосунку для нових розробників. Новий розробник може скопіювати кодову базу застосунку на свою машину, необхідними вимогами для якої є тільки наявність середовища виконання мови програмування та наявність менеджера залежностей. Все необхідне для запуску коду застосунку може бути налаштоване за допомогою визначеної команди збірки. Наприклад, команда збірки для Ruby/Bundler є bundle install, а для Clojure/Leiningen це lein deps.
Застосунок дванадцяти факторів також ніколи не залежить від неявно існуючих будь-яких системних інструментів. Прикладом може бути запуск застосунком таких системних інструментів, як ImageMagick або curl. У той час, як ці інструменти можуть бути встановлені на багатьох або навіть більшості систем, немає жодної гарантії, що вони будуть встановлені на всіх системах, де застосунок може запускатися в майбутньому, або версія інструменту, встановлена в системі, буде сумісна з застосунком. Якщо застосунку потрібно запускати певні системні інструменти, то такі інструменти мають бути включені в сам застосунок.
III. Конфігурація
Конфігурація застосунку — це все, що може змінюватися між розгортаннями (staging-розгортання, production-розгортання, локальне середовище розробника тощо). Це включає:
- Параметри підключення до бази даних, Memcached і інших сторонніх сервісів;
- Реєстраційні дані для підключення до зовнішніх сервісів, таких як Amazon S3 або Twitter;
- Значення, що залежать від середовища розгортання, такі як канонічне ім’я хосту.
Застосунки іноді зберігають конфігурації як константи в коді. Це є порушенням методології дванадцяти факторів, яка вимагає обов’язкового відокремлення конфігурації від коду. Конфігурації застосунку в розгортаннях суттєво відрізняються, код — однаковий.
Лакмусовим папірцем того, чи правильно розділені конфігурація і код, є можливість в будь-який момент відкрити вихідний код застосунку у вільний доступ, при цьому не оприлюднюючи будь-яких приватних даних.
Визначення “конфігурації” не включає в себе внутрішні налаштування застосунку, такі як config/routes.rb в Rails, або як пов’язані основні модулі в Spring Framework. Ці налаштування не змінюються між розгортаннями, і тому краще місце для них — саме в коді.
Іншим підходом до конфігурації є використання конфігураційних файлів, що не зберігаються в систему контролю версій, таких як config/database.yml в Rails. Це перевага у порівнянні з використанням констант в коді, але все ж таки має суттєві недоліки: є ймовірність помилково зберегти файл конфігурації в репозиторій; існує тенденція коли конфігураційні файли розкидані в різних місцях і в різних форматах, і стає важко передивлятися всі налаштування і керувати ними в одному місці. Крім того, формати цих файлів, як правило, специфічні для конкретної мови програмування чи фреймворку.
Застосунок дванадцяти факторів зберігає конфігурацію в змінних оточення (часто скорочується до env vars або env). Значення змінних оточення легко змінити між розгортаннями без зміни коду; на відміну від конфігураційних файлів, менш ймовірно випадково зберегти їх в репозиторій коду; і на відміну від конфігураційних файлів або інших механізмів конфігурації, таких як Java System Properties, вони є стандартом, незалежним від мови програмування чи фреймворку.
Іншим аспектом керування конфігурацією є групування. Іноді застосунки об’єднують конфігурації в іменовані групи (які часто називаються “оточеннями”), які називаються в залежності від конкретного розгортання, наприклад, development, test і production оточення в Rails. Цей метод погано масштабується: чим більше створюється різних розгортань застосунку, тим більше необхідно нових імен оточень, наприклад, staging або qa. При подальшому рості проекту розробники можуть додавати свої власні спеціальні оточення, наприклад, joes-staging, що призводить до комбінаторного вибуху конфігурації, який робить керування розгортанням застосунку нестабільним.
У застосунку дванадцяти факторів змінні оточення є незв’язаними між собою засобами керування. Кожна змінна повністю незалежна від інших. Вони ніколи не групуються разом в “оточення”, керування ними здійснюється незалежно для кожного розгортання. Ця модель добре масштабується разом з появою більшої кількості розгортань застосунку протягом його експлуатації.
IV. Сторонні служби
Стороння служба — це будь-яка служба, яка доступна застосунку по мережі і необхідна для його нормальної роботи: бази даних (наприклад, MySQL або CouchDB), системи черг повідомлень (наприклад, RabbitMQ або Beanstalkd), служби SMTP для вихідної пошти (наприклад, Postfix), системи кешування (наприклад, Memcached) тощо.
Допоміжні служби, такі як бази даних, традиційно управляються тими ж системними адміністраторами, які розгортають застосунок. Окрім локальних служб, застосунок може також використовувати служби, що надаються і керуються третіми сторонами: SMTP-сервіси (наприклад, Postmark), сервіси збору метрик (наприклад, або ), сховища бінарних даних (наприклад, Amazon S3), а також різні сервіси, що надають доступ через API (наприклад, Twitter, Google Maps, або Last.fm).
Код застосунку дванадцяти факторів не бачить жодних відмінностей між локальними і сторонніми сервісами. Для застосунку кожен з них є підключеним ресурсом, доступним за URL-адресою або іншими даними, що зберігаються в конфігурації. Розгортання застосунку дванадцяти факторів повинно мати можливість, наприклад, замінити локальну базу даних MySQL на будь-яку керовану третьою стороною (наприклад, Amazon RDS) без жодних змін в коді застосунку. Крім того, локальний сервер SMTP може бути замінений на сторонній SMTP-сервіс (наприклад, Postmark) без зміни коду. В обох випадках необхідно змінити лише налаштування відповідного ресурсу в конфігурації застосунку.
Кожна окрема стороння служба є ресурсом. Наприклад, база даних MySQL є ресурсом; дві бази даних MySQL (що використовуються для шардінгу на рівні застосунку) кваліфікуються як два різних ресурси. Застосунок дванадцяти факторів сприймає ці бази даних як підключені ресурси, що вказує на їхній слабкий зв’язок з розгортанням, в якому вони підключені.
Ресурси за необхідності можуть бути підключені та відключені до розгортання застосунку. Наприклад, якщо база даних застосунку функціонує некорекно у зв’язку з апаратними проблемами, адміністратор може запустити новий сервер бази даних, відновленої з останньої резервної копії. Поточна база даних може бути відключена, а нова база даних підключена — все це без будь-яких змін коду.
V. Збірка, реліз, виконання
перетворюється в розгортання (крім розгортання для розробки) у три етапи:
- Етап збірки — це трансформація, яка перетворює код в репозиторії у пакунок, що може бути запущений, і який називається збірка. Використовуючи версію коду за вказаним у процесі розгортання коммітом, етап збірки завантажує залежності та компілює бінарні файли і ресурси.
- Етап релізу приймає збірку, отриману на етапі збірки, і об’єднує її з поточною конфігурацією розгортання. Отриманий реліз містить збірку і конфігурацію і готовий до негайного запуску в середовищі виконання.
- Етап виконання запускає застосунок у середовищі виконання, увімкнувши деякий набір процесів застосунку з певного релізу.
Код стає збіркою, яка поєднується з конфігурацією для створення релізу.
Застосунок дванадцяти факторів дотримується суворого відокремлення етапів збірки, релізу і виконання. Наприклад, не можна вносити зміни в код під час етапу виконання, оскільки немає способу поширити ці зміни назад на етап збірки.
Інструменти розгортання, як правило, надають засоби керування релізами, які дають можливість відкату до попередньої версії. Наприклад, інструмент розгортання Capistrano зберігає релізи в підкаталог з назвою releases, де поточний реліз є символічним посиланням на каталог поточного релізу. Команда Capistrano rollback дає можливість швидко виконати відкат до попередньої версії.
Кожен реліз повинен завжди мати унікальний ідентифікатор, наприклад, мітку часу релізу (наприклад, 2011-04-06-20:32:17) або номер, що зростає (наприклад, v100). Релізи можуть тільки додаватися, неможливо змінити реліз після його створення. Будь-які зміни мають створювати новий реліз.
Збірка ініцюється розробником застосунку щоразу при розгортанні нового коду. Запуск етапу виконання, навпаки, може відбуватися автоматично в таких випадках, як перезавантаження сервера або перезапуск процесу, що впав, менеджером процесів. Таким чином, етап виконання має бути максимально технічно простим, бо проблеми, які заважають застосунку запуститися, можуть призвести до його зупинки посеред ночі, коли розробників немає на місці. Етап збірки може бути більш складним, бо можливі помилки завжди видимі розробнику, який запустив процес розгортання.
VI. Процеси
Застосунок запускається в середовищі виконання у вигляді одного або декількох процесів.
У найпростішому випадку код є окремим скриптом, середовище виконання — ноутбук розробника зі встановленим середовищем виконання мови програмування, а процес запускається за допомогою командного рядка (наприклад, python my_script.py). В іншому випадку, це може бути production-розгортання складного застосунку, яке може використовувати багато типів процесів, кожен з яких запущений у необхідній кількості екземплярів.
Процеси застосунку дванадцяти факторів не зберігають внутрішній стан (stateless) і не розділяють ресурси. Будь-які дані, що підлягають збереженню, мають зберігатися в сторонній службі зі збереженням внутрішнього стану (stateful) (як правило, в базі даних).
Пам’ять та файлова система процесу можуть бути використані як короткостроковий кеш. Наприклад, завантаження, обробка і збереження великого файлу в базі даних. Застосунок дванадцяти факторів ніколи не припускає, що щось, закешоване в пам’яті або на диску, буде доступне при наступному запиті — за наявності багатьох запущених процесів різних типів є велика ймовірність, що наступний запит буде оброблений іншим процесом. Навіть при роботі тільки одного процесу перезапуск (викликаний розгортанням, змінами конфігурації або переміщенням процесу в інше фізичне місце розташування середовищем виконання), як правило, призведе до знищення всіх локальних (у пам’яті і файловій системі) станів.
Пакувальники ресурсів (наприклад, або django-compressor) використовують файлову систему як кеш для скомпільованих ресурсів. Застосунок дванадцяти факторів надає перевагу здійсненню такої компіляції під час етапу збірки, наприклад, як в Rails asset pipeline, а не під час виконання.
Деякі вебсистеми покладаються на “липкі сесії” — тобто кешують дані сесії користувача в пам’яті процесу застосунку і очікують, що наступні запити від того ж самого користувача будуть спрямовані до того ж самого процесу. Липкі сесії є порушенням дванадцяти факторів і їх ніколи не слід використовувати та покладатися на них. Дані сесії користувача є хорошим кандидатом для сховища даних, яке надає функцію обмеження терміну зберігання, наприклад, Memcached або Redis.
VII. Прив’язка портів
Вебзастосунки іноді запускаються всередині контейнера вебсервера. Наприклад, PHP-застосунок може бути запущений як модуль всередині вебсервера, або Java-застосунок може бути запущений всередині Apache Tomcat.
Застосунок дванадцяти факторів є повністю автономним і в процесі виконання, щоб створити вебсервіс, доступний через web, не покладається на ін’єкцію[] вебсервера в середовище виконання. Вебзастосунок експортує HTTP-сервіс шляхом прив’язки до порту і прослуховує запити, що надходять на цей порт.
У локальному development середовищі розробник відвідує URL-адресу вигляду http://localhost:5000/ для доступу до сервісу, що експортується застосунком. При розгортанні рівень маршрутизації обробляє запити до загальнодоступного хосту і перенаправляє їх до порту, до якого прив’язано вебпроцес.
Як правило, це реалізується за допомогою оголошення залежностей шляхом додавання бібліотеки вебсервера до застосунку, наприклад, Tornado для Python, Thin для Ruby або Jetty для Java та інших мов на основі JVM. Це відбувається повністю в просторі користувача, тобто в коді застосунку. Прив’язка до порту для обробки запитів є “угодою” із середовищем виконання.
HTTP — не єдиний сервіс, який може бути експортований шляхом прив’язки до порту. Майже будь-який вид серверного програмного забезпечення може бути запущений, прив’язаний до порту і може очікувати вхідні запити. Прикладами є ejabberd (використовує XMPP) і Redis (використовує протокол Redis).
Також зверніть увагу, що підхід прив’язки до портів означає, що застосунок може виступати як стороння служба для іншого застосунку, надаючи свою URL-адресу як ресурс в конфігурації застосунку-споживача.
VIII. Конкурентність
Будь-яка комп’ютерна програма після запуску представлена одним або декількома процесами. Вебдодатки мають різні форми виконання процесів. Наприклад, PHP-процеси виконуються як дочірні процеси Apache, які запускаються в разі потреби в залежності від навантаження. Java-процеси використовують протилежний підхід: JVM забезпечує один масивний мета-процес, який резервує велику кількість системних ресурсів (процесора і пам’яті) під час його запуску, і керує конкурентністю всередині себе за допомогою потоків виконання (threads). В обох випадках запущені процеси видимі для розробників застосунку мінімально.
Масштабування виражається у вигляді запущених процесів, різноманітність навантаження виражається в типах процесів.
В застосунку дванадцяти факторів, процеси є сутностями першого класу. Процеси в застосунку дванадцяти факторів взяли сильні сторони від моделі процесів UNIX для запуску сервісів. Використовуючи цю модель, розробник може спроектувати свій застосунок таким чином, що для обробки різних робочих навантажень необхідно призначити кожному виду робіт свій тип процесу. Наприклад, HTTP-запити можуть бути оброблені за допомогою вебпроцесу (web process), а тривалі фонові завдання оброблені робочим процесом (worker process).
Це не виключає можливості використання індивідуального мультиплексування для окремих процесів через потоки виконання віртуальної машини або асинхронні/подієві моделі в таких інструментах, як , або Node.js. Але індивідуальна віртуальна машина може масшабуватися тільки обмежено (вертикальне масшабування), тому застосунок також повинен мати можливість бути запущеним як декілька процесів на декількох фізичних машинах.
Модель, побудована на процесах, дійсно показує себе з найкращого боку, коли постає необхідність масштабування. Відсутність розділених даних і горизонтальне розділення процесів застосунку дванадцяти факторів означає, що додавання більшої конкурентності є простою і надійною операцією. Масив типів процесів і кількість процесів кожного типу називається формацією процесів.
Процеси застосунку дванадцяти факторів ніколи не мають демонізуватися та записувати PID-файли. Замість цього вони мають покладатися на менеджер процесів операційної системи (наприклад, systemd, розподілений менеджер процесів на хмарній платформі, або в процесі розробки на такий інструмент, як ) для керування потоком виведення, реагування на падіння процесів і обробку ініційованих користувачем перезавантаження чи завершення роботи.
IX. Утилізовуваність
Процеси застосунку дванадцяти факторів є утилізовуваними, тобто вони можуть бути запущені або зупинені в будь-який момент. Це сприяє гнучкому масштабуванню, швидкому розгортанню коду або змінам конфігурації і надійності production-розгортання.
Слід намагатися мінімізувати час запуску процесів. В ідеалі час між моментом виконання команди запуску процесу і моментом, коли процес готовий приймати запити чи задачі, має тривати лише пару секунд. Короткий час запуску забезпечує більшу гнучкість для релізу і масштабування. Крім того, це підвищує стійкість, оскільки менеджер процесів може легко переміщувати процеси на нові фізичні машини у разі необхідності.
Процеси мають коректно завершувати свою роботу, коли вони отримують SIGTERM сигнал від диспетчеру процесів. Для вебпроцесу коректне завершення роботи досягається завдяки припиненню прослуховування порту, до якого він прив’язаний (що означає відмову від отримання будь-яких нових запитів), завершенню обробки будь-яких поточних запитів та зупинці самого процесу. В цій моделі передбачається, що HTTP-запити короткі (не більше ніж кілька секунд), а у разі довгих запитів (long polling) клієнт має намагатися відновити з’єднання у разі його втрати.
Для процесу, що виконує фонові задачі (worker), коректне завершення роботи досягається за рахунок повернення поточного завдання назад у чергу задач. Наприклад, в RabbitMQ робочий процес може надіслати команду NACK; в Beanstalkd завдання повертається в чергу автоматично щоразу, коли процес втрачає з’єднання. Системи, що використовують блокування, такі як Delayed Job, мають бути повідомлені, щоб звільнити блокування задачі. В цій моделі передбачається, що всі задачі є повторно вхідними, що зазвичай досягається шляхом обертання результатів їхньої роботи в транзакції або шляхом використання ідемпотентних операцій.
Процеси також мають бути стійкі до раптової зупинки в разі відмови апаратних засобів, на яких вони запущені. Хоча це менш ймовірна подія, ніж коректне завершення роботи за допомогою сигналу SIGTERM, вона все ж таки може статися. Рекомендованим підходом є використання надійних черг завдань, таких як Beanstalkd, які повертають завдання в чергу задач, коли клієнти втрачають з’єднання або від’єднуються по тайм-ауту. У будь-якому випадку, застосунок дванадцяти факторів має проектуватися таким чином, щоб обробляти несподівані та некоректні вимкнення. Прикладом вдалої реалізації архітектури “тільки аварійного вимкнення” (Crash-only design) є CouchDB.
X. Dev/prod паритет
Історично склалося, що є суттєві відмінності між development середовищем (розробник вносить живі зміни в локально розгорнутий застосунок) і production середовищем (до якого мають доступ кінцеві користувачі). Ці відмінності проявляються в трьох областях:
- Різниця в часі: Розробник може працювати над кодом, який потрапить у production через дні, тижні або навіть місяці;
- Різниця в персоналі: Розробники пишуть код, Ops-інженери розгортають його;
- Різниця в інструментах: Розробники можуть використовувати стек технологій такий, як Nginx, SQLite та OS X, в той час як на production використовується Apache, MySQL та Linux.
Застосунок дванадцяти факторів проектується для безперервного розгортання, завдяки мінімізації різниці між production і development середовищами. Розглянемо три відмінності, описані вище:
- Зменшити різницю в часі: розробник може написати код і він буде розгорнутий через декілька годин або навіть хвилин;
- Зменшити різницю в персоналі: розробники, які писали код, беруть активну участь в його розгортанні і спостерігають за його поведінкою на production;
- Зменшити різницю в інструментах: тримати development та production середовища максимально ідентичними.
Резюмуючи сказане вище в таблицю:
Традиційний застосунок | Застосунок дванадцяти факторів | |
---|---|---|
Час між розгортаннями | Тижні | Години |
Автор коду/той хто розгортає | Різні люди | Ті ж люди |
Dev/Prod розгортання | Різні | Максимально ідентичні |
Сторонні служби, такі як бази даних, системи черг повідомлень або кеш, є однією з областей, де dev/prod паритет має важливе значення. Багато мов програмування мають бібліотеки, які спрощують доступ до сторонніх служб, в тому числі, адаптери для різних видів сервісів. Деякі приклади наведені в таблиці нижче.
Тип | Мова | Бібліотека | Адаптери |
---|---|---|---|
База даних | Ruby/Rails | ActiveRecord | MySQL, PostgreSQL, SQLite |
Черга повідомлень | Python/Django | Celery | RabbitMQ, Beanstalkd, Redis |
Кеш | Ruby/Rails | ActiveSupport::Cache | Пам'ять, файлова система, Memcached |
Іноді розробники бачать переваги у використанні “легких” сторонніх служб в їхньому локальному середовищі, в той час як більш серйозні і надійні сторонні служби будуть використовуватися у production. Наприклад, локально використовують SQLite, а на production PostgreSQL; або локально пам’ять процесу для кешування, а на production Memcached.
Розробник застосунку дванадцяти факторів уникає використання різних сторонніх служб в development і production середовищах, навіть якщо адаптери теоретично абстраговані від будь-яких відмінностей у сторонніх службах. Відмінності між сторонніми службами означають, що може виникнути крихітна несумісність, в результаті чого код, який працював і пройшов тестування в development та staging середовищах, після розгортання не працює в production середовищі. Такий тип помилок створює перешкоди, які нівелюють переваги безперервного розгортання. Ціна цих перешкод і подальшого відновлення безперервного розгортання надзвичайно висока, якщо розглядати в сукупності за весь час експлуатації застосунку.
Встановлення локально “легких” сторонніх сервісів вже не є таким привабливим, як було раніше. Сучасні надійні сторонні сервіси, такі як Memcached, PostgreSQL і RabbitMQ, досить легко встановити і запустити завдяки сучасним менеджерам пакунків, таким як Homebrew і apt-get. Крім того, декларативні інструменти підготовки середовища, такі як і Puppet, у поєднанні з “легким” віртуальним середовищем, таким як Vagrant, дозволяють розробникам запускати локальні середовища, які наближені до production. Ціна встановлення і використання цих систем є низькою у порівнянні з користю dev/prod паритету і безперервного розгортання.
Адаптери для різних сторонніх сервісів все ж корисні, тому що вони роблять перенесення застосунку для використання з іншими сторонніми сервісами відносно безболісним. Але всі розгортання застосунку (development, staging та production середовища) мають використовувати один і той самий тип і версію кожного зі сторонніх сервісів.
XI. Журналювання
Журналювання забезпечує наочне уявлення про поведінку запущеного застосунку. Зазвичай у серверних середовищах журнали записуються у файл на диску (“logfile”), але це лише один з форматів виведення.
Журнал — це потік агрегованих, впорядкованих за часом подій, зібраних з потоків виведення всіх запущених процесів і сторонніх сервісів. Журнал в сирому вигляді, як правило, має текстовий формат з однією подією на кожен рядок (хоча трасування винятків можуть займати кілька рядків). Журнали не мають фіксованого початку і кінця, потік безперервний поки працює застосунок.
Застосунок дванадцяти факторів ніколи не займається маршрутизацію і зберіганням свого потоку виведення. Застосунок не повинен записувати журнал у файл або керувати файлами журналів. Замість цього кожен запущений процес записує свій потік подій без буферизації в стандартне виведення stdout. В development середовищі розробник має можливість переглядати цей потік в терміналі, щоб спостерігати за поведінкою застосунку.
В staging та production розгортаннях потік виведення кожного процесу перехоплюється середовищем виконання, збирається разом з усіма іншими потоками виведення застосунку і спрямовується до одного або кількох кінцевих пунктів призначення для перегляду і довгострокового архівування. Ці кінцеві пункти призначення не видимі для застосунку і не налаштовуються ним, вони керуються середовищем виконання. Для цього можуть бути використані маршрутизатори журналів з відкритим вихідним кодом (наприклад, та ).
Потік подій застосунку може бути направлений у файл або переглянутий у терміналі в режимі реального часу. Найважливішим є те, що потік може бути направлений у систему індексування і аналізу журналів, таку як Splunk, або систему зберігання даних загального призначення, таку як Hadoop/Hive. Ці системи мають широкі можливості і гнучкість для детального аналізу поведінки застосунку протягом тривалого часу, в тому числі:
- Виявлення конкретних подій у минулому;
- Побудова графіків трендів (наприклад, кількість запитів за хвилину);
- Активне оповіщення відповідно до визначених користувачем евристичних правил (наприклад, попередження, коли кількість помилок за хвилину перевищує певний поріг).
XII. Задачі адміністрування
Формація процесів є певним набором процесів, які необхідні для виконання регулярних задач застосунку (наприклад, обробка вебзапитів). Разом з тим, розробникам часто необхідно виконувати разові адміністративні задачі для обслуговування застосунку, такі як:
Запуск міграції бази даних (наприклад, manage.py migrate в Django, rake db:migrate в Rails). Запуск консолі (REPL) для виконання довільного коду або перевірки моделі застосунку на діючій базі даних. Більшість мов надають REPL шляхом запуску інтерпретатора без будь-яких аргументів (наприклад, python або perl) або в деяких випадках мають окрему команду (наприклад, irb для Ruby, rails console для Rails). Запуск разових скриптів, збережених в репозиторії застосунку (наприклад, php scripts/fix_bad_records.php). Разові процеси адміністрування слід запускати в такому ж середовищі, в якому запущені регулярні тривалі процеси застосунку. Вони запускаються на базі релізу, використовуючи ту ж кодову базу і конфігурацію, як і будь-який інший процес на базі цього релізу. Для уникнення проблем з синхронізацією код адміністрування має поставлятися з кодом застосунку.
Для всіх типів процесів мають використовуватися однакові методи ізоляції залежностей. Наприклад, якщо вебпроцес Ruby використовує команду bundle exec thin start, то для міграції бази даних слід використовувати bundle exec rake db:migrate. Аналогічно, для програми на Python з Virtualenv слід використовувати bin/python як для запуску вебсервера Tornado, так і для запуску будь-яких manage.py процесів адміністрування.
Методологія дванадцяти факторів надає перевагу мовам, які мають REPL “з коробки”, і які дозволяють легко запускати разові скрипти. У локальному development середовищі розробник може запустити процес адміністрування за допомогою консольної команди всередині директорії застосунку. У production середовищі для запуску такого процесу розробники можуть використовувати ssh або інший механізм віддаленого виконання команд, що надається середовищем виконання.
За межами дванадцяти факторів
Існують розширення оригінальної методології дванадцяти факторів для побудови ситем призначених для розгортання в хмарному середовищі, так званих cloud-native систем. До дванадцяти оригінальних факторів додаються ще три: Телеметрія, Безпека і концепція "Спочатку API".
Спочатку API
Цей фактор визначає, що той продукт, що розробляється, являє собою API який, в свою чергу, має клієнтів, тобто використовується іншими застосунками чи сервісами. Наприклад, той же графічний інтерфейс, чи то мобільний, чи веб, є нічим іншим ніж просто споживачем якогось API. Підхід "Спочатку API" є важливою складовою розробки нативних хмарних (cloud-native) систем і застосунків які базуються на мікросервісній чи сервіс-орієнтовній архітектурі. Існує безліч інструментів і стандартів для підтримки розробки в стилі "Спочатку API". Наприклад, стандартний формат для специфікацій API, що використувує розмітковий синтакс . Цей формат є більш прочитним ніж JSON чи WSDL і може бути використаний кодом для генерування документації, або, навіть, для створення серверних моків. В той же час, набір інструментів на кшталт надає можливості такі як інтеграція з GitHub і генерування моків. Наприклад, якщо є необхідність в створенні клієнта для API - все що треба це надати посилання Apiary де вона зможе прочитати , побачити приклад коду для споживання даного API і, навіть, виконати запити на запущенний мок.
Телеметрія
Розгортання застосунку на локальній машині дає змогу спостерігати що відбувається всередині запущеної системи, зневаджувати та використовувати сотні інструментів що дають змогу зазирнути в глибини застосунку. Але системи які розгорнуті в хмарному середовищі не надають таких можливостей. Тому дуже важливо мати інструменти які дозволять віддалено моніторити стан системи в хмарі. Виділяють кілька категорій даних для відслідковування:
- Моніторинг продуктивності
- Доменно-специфічна телеметрія
- Здоров'я та системні журнали
Аутентифікація та авторизація
Оригінальна концепція дванадцяти факторів не говорить нічого про безпеку, яка є життєво важливим елементом будь-якого застосунку чи хмарного середовища. Cloud-native система завжди повинна бути безпечною та захищеною системою. В ідеальному світі всі запити до застосунку мають бути захищені контролем доступу за ролями (role-based access control). Застосунок повинен "знати" від кого прийшов запит і які ролі має цей споживач. Ці ролі диктують чи має цей клієнт доступ до даного функціоналу чи інформації чи ні. За допомогою таких інструментів як OAuth2, OpenID Connect, різноманітні SSO сервери і стандарти, бібліотеки авторизації і аутентифікації, безпека має бути чимось що народжується в перший же день розробки проекту і не повинна бути чимось що прикручується в продакшені.
Посилання
- Wiggins, Adam. . 12factor.net (англ.). Архів оригіналу за 31 березня 2019. Процитовано 30 січня 2018.
- Hoffman, Kevin (2016). Beyond the Twelve-Factor App (English) . Beijing Boston Farnham Sebastopol Tokyo: O’Reilly Media, Inc. ISBN .
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Zastosunok dvanadcyati faktoriv angl Twelve Factor App 12 factor ce metodologiya dlya stvorennya SaaS zastosunkiv yaki Vikoristovuyut deklarativnij format dlya avtomatizaciyi vstanovlennya ta nalashtuvannya sho zvodit do minimumu vitrati chasu i koshtiv dlya novih rozrobnikiv sho priyednuyutsya do proektu Mayut ugodu z operacijnoyu sistemoyu proponuyuchi maksimalnu perenosimist mizh Pridatni dlya rozgortannya na suchasnih hmarnih platformah sho usuvaye neobhidnist u serverah ta yih sistemnomu administruvanni Minimizuyut riznicyu mizh seredovishem rozrobki i production seredovishem sho dozvolyaye bezperervne rozgortannya dlya zabezpechennya maksimalnoyi spritnosti rozrobki agility Mozhut masshtabuvatisya bez znachnih zmin v instrumentah arhitekturi i praktici rozrobki Metodologiyu dvanadcyati faktoriv mozhna vikoristati dlya zastosunkiv sho napisani bud yakoyu movoyu programuvannya ta vikoristovuyut bud yaku kombinaciyu iz storonnih sluzhb bazi danih chergi kesh pam yat tosho Dvanadcyat faktorivDvanadcyat faktoriv Faktor Opis I Kodova baza Odna kodova baza sho vidslidkovuyetsya v sistemi kontrolyu versij ta maye bagato rozgortan II Zalezhnosti Yavno ogoloshujte ta izolyujte zalezhnosti III Konfiguraciya Zberigajte konfiguraciyu v seredovishi vikonannya IV Storonni sluzhbi Vvazhajte storonni sluzhbi backing services pidklyuchenimi resursami V Zbirka reliz vikonannya Suvoro vidokremlyujte etapi zbirki ta vikonannya VI Procesi Zapuskajte zastosunok yak odin abo dekilka procesiv bez zberezhennya vnutrishngo stanu stateless VII Priv yazka portiv Eksportujte servisi za dopomogoyu priv yazki portiv port binding VIII Konkurentnist Masshtabujte zastosunok za dopomogoyu procesiv IX Utilizovuvanist Pidvishujte nadijnist za dopomogoyu shvidkogo zapusku i korektnogo vimknennya X Dev prod paritet Usi seredovisha development staging production tosho mayut buti maksimalno identichnimi mizh soboyu XI Zhurnalyuvannya Sprijmajte zhurnalyuvannya logs yak potoki podij XII Zadachi administruvannya Vikonujte zadachi administruvannya keruvannya za dopomogoyu razovih procesiv Detalnij opisI Kodova baza Zastosunok dvanadcyati faktoriv zavzhdi vidslidkovuyutsya v sistemi kontrolyu versij takij yak Git Mercurial abo Subversion Kopiya bazi danih vidstezhennya revizij nazivayetsya repozitorij kodu code repository sho chasto skorochuyetsya do code repo abo prosto repo Kodova baza ce odin repozitorij v centralizovanih sistemah kontrolyu versij yak Subversion abo dekilka repozitoriyiv yaki mayut spilnij pochatkovij kommit v decentralizovanih sistemah kontrolyu versij yak Git Odna kodova baza bagato rozgortan Zavzhdi isnuye odnoznachna vidpovidnist mizh kodovoyu bazoyu i zastosunkom Za nayavnosti kilkoh baz kodu ce ne zastosunok ce rozpodilena sistema Kozhen komponent v rozpodilenij sistemi ye zastosunkom i kozhen z nih mozhe okremo dotrimuvatisya dvanadcyati faktoriv Kilka riznih zastosunkiv sho spilno vikoristovuyut zagalnu bazu kodu ye porushennyam dvanadcyati faktoriv Rishennyam v danij situaciyi ye vidilennya zagalnogo kodu v biblioteki yaki mozhut buti pidklyucheni cherez menedzher zalezhnostej Isnuye tilki odna kodova baza dlya kozhnogo zastosunku ale mozhe buti bagato rozgortan odnogo i togo samogo zastosunku Rozgortannyam ye zapushenij ekzemplyar zastosunku Ce yak pravilo production sajt i odin abo bilshe staging sajtiv promizhnih rozgortan Krim togo rozrobnik maye kopiyu zastosunku zapushenogo v jogo lokalnomu seredovishi rozrobki Kozhnu z takih kopij takozh mozhna kvalifikuvati yak rozgortannya Kodova baza maye buti yedina dlya vsih rozgortan hocha v kozhnomu rozgortanni mozhut buti aktivni rizni yiyi versiyi Napriklad rozrobnik mozhe mati deyaki zmini u kodi yaki she ne dodani v staging rozgortannya staging rozgortannya mozhe mati deyaki zmini yaki she ne dodani v production rozgortannya Ale vsi voni vikoristovuyut odnu i tu samu kodovu bazu takim chinom mozhna yih identifikuvati yak rizni rozgortannya odnogo i togo zh zastosunku II Zalezhnosti Bilshist mov programuvannya mayut sistemi pakunkiv dlya rozpovsyudzhennya bibliotek taki yak CPAN dlya Perl abo dlya Ruby Biblioteki vstanovleni cherez sistemu pakunkiv mozhut buti dostupnimi dlya vsiyeyi sistemi tak zvani site packages abo vstanovleni v katalog zastosunku tak zvani vendoring abo bundling Zastosunok dvanadcyati faktoriv nikoli ne zalezhit vid neyavno isnuyuchih dosupnih vsij sistemi pakunkiv Zastosunok povno i tochno vkazuye vsi svoyi zalezhnosti za dopomogoyu manifestu ogoloshennya zalezhnostej Krim togo vin vikoristovuye instrument izolyaciyi zalezhnistej pid chas vikonannya shob garantuvati sho niyaki neyavni zalezhnosti ne prosochilisya z zovnishnoyi sistemi Povna i yavna specifikaciya zalezhnostej vikoristovuyetsya odnakovo yak pri rozrobci tak i v production Napriklad Bundler v Ruby vikoristovuye yak format manifestu dlya ogoloshennya zalezhnostej i bundle exec dlya izolyaciyi zalezhnostej U Python ye dva okremi instrumenti dlya cih zadach Pip vikoristovuyetsya dlya ogoloshennya i Virtualenv dlya izolyaciyi Navit C maye dlya ogoloshennya zalezhnostej a statichne zv yazuvannya mozhe zabezpechiti izolyaciyu zalezhnostej Yakij bi ne vikoristovuvavsya nabir instrumentiv ogoloshennya i izolyaciya zalezhnostej zavzhdi mayut vikoristovuvatisya razom tilki odne abo inshe ne ye dostatnoyu umovoyu dlya zadovolennya dvanadcyati faktoriv Odniyeyu z perevag yavnogo ogoloshennya zalezhnostej ye te sho ce sproshuye nalashtuvannya zastosunku dlya novih rozrobnikiv Novij rozrobnik mozhe skopiyuvati kodovu bazu zastosunku na svoyu mashinu neobhidnimi vimogami dlya yakoyi ye tilki nayavnist seredovisha vikonannya movi programuvannya ta nayavnist menedzhera zalezhnostej Vse neobhidne dlya zapusku kodu zastosunku mozhe buti nalashtovane za dopomogoyu viznachenoyi komandi zbirki Napriklad komanda zbirki dlya Ruby Bundler ye bundle install a dlya Clojure Leiningen ce lein deps Zastosunok dvanadcyati faktoriv takozh nikoli ne zalezhit vid neyavno isnuyuchih bud yakih sistemnih instrumentiv Prikladom mozhe buti zapusk zastosunkom takih sistemnih instrumentiv yak ImageMagick abo curl U toj chas yak ci instrumenti mozhut buti vstanovleni na bagatoh abo navit bilshosti sistem nemaye zhodnoyi garantiyi sho voni budut vstanovleni na vsih sistemah de zastosunok mozhe zapuskatisya v majbutnomu abo versiya instrumentu vstanovlena v sistemi bude sumisna z zastosunkom Yaksho zastosunku potribno zapuskati pevni sistemni instrumenti to taki instrumenti mayut buti vklyucheni v sam zastosunok III Konfiguraciya Konfiguraciya zastosunku ce vse sho mozhe zminyuvatisya mizh rozgortannyami staging rozgortannya production rozgortannya lokalne seredovishe rozrobnika tosho Ce vklyuchaye Parametri pidklyuchennya do bazi danih Memcached i inshih storonnih servisiv Reyestracijni dani dlya pidklyuchennya do zovnishnih servisiv takih yak Amazon S3 abo Twitter Znachennya sho zalezhat vid seredovisha rozgortannya taki yak kanonichne im ya hostu Zastosunki inodi zberigayut konfiguraciyi yak konstanti v kodi Ce ye porushennyam metodologiyi dvanadcyati faktoriv yaka vimagaye obov yazkovogo vidokremlennya konfiguraciyi vid kodu Konfiguraciyi zastosunku v rozgortannyah suttyevo vidriznyayutsya kod odnakovij Lakmusovim papircem togo chi pravilno rozdileni konfiguraciya i kod ye mozhlivist v bud yakij moment vidkriti vihidnij kod zastosunku u vilnij dostup pri comu ne oprilyudnyuyuchi bud yakih privatnih danih Viznachennya konfiguraciyi ne vklyuchaye v sebe vnutrishni nalashtuvannya zastosunku taki yak config routes rb v Rails abo yak pov yazani osnovni moduli v Spring Framework Ci nalashtuvannya ne zminyuyutsya mizh rozgortannyami i tomu krashe misce dlya nih same v kodi Inshim pidhodom do konfiguraciyi ye vikoristannya konfiguracijnih fajliv sho ne zberigayutsya v sistemu kontrolyu versij takih yak config database yml v Rails Ce perevaga u porivnyanni z vikoristannyam konstant v kodi ale vse zh taki maye suttyevi nedoliki ye jmovirnist pomilkovo zberegti fajl konfiguraciyi v repozitorij isnuye tendenciya koli konfiguracijni fajli rozkidani v riznih miscyah i v riznih formatah i staye vazhko peredivlyatisya vsi nalashtuvannya i keruvati nimi v odnomu misci Krim togo formati cih fajliv yak pravilo specifichni dlya konkretnoyi movi programuvannya chi frejmvorku Zastosunok dvanadcyati faktoriv zberigaye konfiguraciyu v zminnih otochennya chasto skorochuyetsya do env vars abo env Znachennya zminnih otochennya legko zminiti mizh rozgortannyami bez zmini kodu na vidminu vid konfiguracijnih fajliv mensh jmovirno vipadkovo zberegti yih v repozitorij kodu i na vidminu vid konfiguracijnih fajliv abo inshih mehanizmiv konfiguraciyi takih yak Java System Properties voni ye standartom nezalezhnim vid movi programuvannya chi frejmvorku Inshim aspektom keruvannya konfiguraciyeyu ye grupuvannya Inodi zastosunki ob yednuyut konfiguraciyi v imenovani grupi yaki chasto nazivayutsya otochennyami yaki nazivayutsya v zalezhnosti vid konkretnogo rozgortannya napriklad development test i production otochennya v Rails Cej metod pogano masshtabuyetsya chim bilshe stvoryuyetsya riznih rozgortan zastosunku tim bilshe neobhidno novih imen otochen napriklad staging abo qa Pri podalshomu rosti proektu rozrobniki mozhut dodavati svoyi vlasni specialni otochennya napriklad joes staging sho prizvodit do kombinatornogo vibuhu konfiguraciyi yakij robit keruvannya rozgortannyam zastosunku nestabilnim U zastosunku dvanadcyati faktoriv zminni otochennya ye nezv yazanimi mizh soboyu zasobami keruvannya Kozhna zminna povnistyu nezalezhna vid inshih Voni nikoli ne grupuyutsya razom v otochennya keruvannya nimi zdijsnyuyetsya nezalezhno dlya kozhnogo rozgortannya Cya model dobre masshtabuyetsya razom z poyavoyu bilshoyi kilkosti rozgortan zastosunku protyagom jogo ekspluataciyi IV Storonni sluzhbi Storonnya sluzhba ce bud yaka sluzhba yaka dostupna zastosunku po merezhi i neobhidna dlya jogo normalnoyi roboti bazi danih napriklad MySQL abo CouchDB sistemi cherg povidomlen napriklad RabbitMQ abo Beanstalkd sluzhbi SMTP dlya vihidnoyi poshti napriklad Postfix sistemi keshuvannya napriklad Memcached tosho Dopomizhni sluzhbi taki yak bazi danih tradicijno upravlyayutsya timi zh sistemnimi administratorami yaki rozgortayut zastosunok Okrim lokalnih sluzhb zastosunok mozhe takozh vikoristovuvati sluzhbi sho nadayutsya i keruyutsya tretimi storonami SMTP servisi napriklad Postmark servisi zboru metrik napriklad abo shovisha binarnih danih napriklad Amazon S3 a takozh rizni servisi sho nadayut dostup cherez API napriklad Twitter Google Maps abo Last fm Kod zastosunku dvanadcyati faktoriv ne bachit zhodnih vidminnostej mizh lokalnimi i storonnimi servisami Dlya zastosunku kozhen z nih ye pidklyuchenim resursom dostupnim za URL adresoyu abo inshimi danimi sho zberigayutsya v konfiguraciyi Rozgortannya zastosunku dvanadcyati faktoriv povinno mati mozhlivist napriklad zaminiti lokalnu bazu danih MySQL na bud yaku kerovanu tretoyu storonoyu napriklad Amazon RDS bez zhodnih zmin v kodi zastosunku Krim togo lokalnij server SMTP mozhe buti zaminenij na storonnij SMTP servis napriklad Postmark bez zmini kodu V oboh vipadkah neobhidno zminiti lishe nalashtuvannya vidpovidnogo resursu v konfiguraciyi zastosunku Kozhna okrema storonnya sluzhba ye resursom Napriklad baza danih MySQL ye resursom dvi bazi danih MySQL sho vikoristovuyutsya dlya shardingu na rivni zastosunku kvalifikuyutsya yak dva riznih resursi Zastosunok dvanadcyati faktoriv sprijmaye ci bazi danih yak pidklyucheni resursi sho vkazuye na yihnij slabkij zv yazok z rozgortannyam v yakomu voni pidklyucheni Resursi za neobhidnosti mozhut buti pidklyucheni ta vidklyucheni do rozgortannya zastosunku Napriklad yaksho baza danih zastosunku funkcionuye nekorekno u zv yazku z aparatnimi problemami administrator mozhe zapustiti novij server bazi danih vidnovlenoyi z ostannoyi rezervnoyi kopiyi Potochna baza danih mozhe buti vidklyuchena a nova baza danih pidklyuchena vse ce bez bud yakih zmin kodu V Zbirka reliz vikonannya peretvoryuyetsya v rozgortannya krim rozgortannya dlya rozrobki u tri etapi Etap zbirki ce transformaciya yaka peretvoryuye kod v repozitoriyi u pakunok sho mozhe buti zapushenij i yakij nazivayetsya zbirka Vikoristovuyuchi versiyu kodu za vkazanim u procesi rozgortannya kommitom etap zbirki zavantazhuye zalezhnosti ta kompilyuye binarni fajli i resursi Etap relizu prijmaye zbirku otrimanu na etapi zbirki i ob yednuye yiyi z potochnoyu konfiguraciyeyu rozgortannya Otrimanij reliz mistit zbirku i konfiguraciyu i gotovij do negajnogo zapusku v seredovishi vikonannya Etap vikonannya zapuskaye zastosunok u seredovishi vikonannya uvimknuvshi deyakij nabir procesiv zastosunku z pevnogo relizu Kod staye zbirkoyu yaka poyednuyetsya z konfiguraciyeyu dlya stvorennya relizu Zastosunok dvanadcyati faktoriv dotrimuyetsya suvorogo vidokremlennya etapiv zbirki relizu i vikonannya Napriklad ne mozhna vnositi zmini v kod pid chas etapu vikonannya oskilki nemaye sposobu poshiriti ci zmini nazad na etap zbirki Instrumenti rozgortannya yak pravilo nadayut zasobi keruvannya relizami yaki dayut mozhlivist vidkatu do poperednoyi versiyi Napriklad instrument rozgortannya Capistrano zberigaye relizi v pidkatalog z nazvoyu releases de potochnij reliz ye simvolichnim posilannyam na katalog potochnogo relizu Komanda Capistrano rollback daye mozhlivist shvidko vikonati vidkat do poperednoyi versiyi Kozhen reliz povinen zavzhdi mati unikalnij identifikator napriklad mitku chasu relizu napriklad 2011 04 06 20 32 17 abo nomer sho zrostaye napriklad v100 Relizi mozhut tilki dodavatisya nemozhlivo zminiti reliz pislya jogo stvorennya Bud yaki zmini mayut stvoryuvati novij reliz Zbirka inicyuyetsya rozrobnikom zastosunku shorazu pri rozgortanni novogo kodu Zapusk etapu vikonannya navpaki mozhe vidbuvatisya avtomatichno v takih vipadkah yak perezavantazhennya servera abo perezapusk procesu sho vpav menedzherom procesiv Takim chinom etap vikonannya maye buti maksimalno tehnichno prostim bo problemi yaki zavazhayut zastosunku zapustitisya mozhut prizvesti do jogo zupinki posered nochi koli rozrobnikiv nemaye na misci Etap zbirki mozhe buti bilsh skladnim bo mozhlivi pomilki zavzhdi vidimi rozrobniku yakij zapustiv proces rozgortannya VI Procesi Zastosunok zapuskayetsya v seredovishi vikonannya u viglyadi odnogo abo dekilkoh procesiv U najprostishomu vipadku kod ye okremim skriptom seredovishe vikonannya noutbuk rozrobnika zi vstanovlenim seredovishem vikonannya movi programuvannya a proces zapuskayetsya za dopomogoyu komandnogo ryadka napriklad python my script py V inshomu vipadku ce mozhe buti production rozgortannya skladnogo zastosunku yake mozhe vikoristovuvati bagato tipiv procesiv kozhen z yakih zapushenij u neobhidnij kilkosti ekzemplyariv Procesi zastosunku dvanadcyati faktoriv ne zberigayut vnutrishnij stan stateless i ne rozdilyayut resursi Bud yaki dani sho pidlyagayut zberezhennyu mayut zberigatisya v storonnij sluzhbi zi zberezhennyam vnutrishnogo stanu stateful yak pravilo v bazi danih Pam yat ta fajlova sistema procesu mozhut buti vikoristani yak korotkostrokovij kesh Napriklad zavantazhennya obrobka i zberezhennya velikogo fajlu v bazi danih Zastosunok dvanadcyati faktoriv nikoli ne pripuskaye sho shos zakeshovane v pam yati abo na disku bude dostupne pri nastupnomu zapiti za nayavnosti bagatoh zapushenih procesiv riznih tipiv ye velika jmovirnist sho nastupnij zapit bude obroblenij inshim procesom Navit pri roboti tilki odnogo procesu perezapusk viklikanij rozgortannyam zminami konfiguraciyi abo peremishennyam procesu v inshe fizichne misce roztashuvannya seredovishem vikonannya yak pravilo prizvede do znishennya vsih lokalnih u pam yati i fajlovij sistemi staniv Pakuvalniki resursiv napriklad abo django compressor vikoristovuyut fajlovu sistemu yak kesh dlya skompilovanih resursiv Zastosunok dvanadcyati faktoriv nadaye perevagu zdijsnennyu takoyi kompilyaciyi pid chas etapu zbirki napriklad yak v Rails asset pipeline a ne pid chas vikonannya Deyaki vebsistemi pokladayutsya na lipki sesiyi tobto keshuyut dani sesiyi koristuvacha v pam yati procesu zastosunku i ochikuyut sho nastupni zapiti vid togo zh samogo koristuvacha budut spryamovani do togo zh samogo procesu Lipki sesiyi ye porushennyam dvanadcyati faktoriv i yih nikoli ne slid vikoristovuvati ta pokladatisya na nih Dani sesiyi koristuvacha ye horoshim kandidatom dlya shovisha danih yake nadaye funkciyu obmezhennya terminu zberigannya napriklad Memcached abo Redis VII Priv yazka portiv Vebzastosunki inodi zapuskayutsya vseredini kontejnera vebservera Napriklad PHP zastosunok mozhe buti zapushenij yak modul vseredini vebservera abo Java zastosunok mozhe buti zapushenij vseredini Apache Tomcat Zastosunok dvanadcyati faktoriv ye povnistyu avtonomnim i v procesi vikonannya shob stvoriti vebservis dostupnij cherez web ne pokladayetsya na in yekciyu sho ce vebservera v seredovishe vikonannya Vebzastosunok eksportuye HTTP servis shlyahom priv yazki do portu i prosluhovuye zapiti sho nadhodyat na cej port U lokalnomu development seredovishi rozrobnik vidviduye URL adresu viglyadu http localhost 5000 dlya dostupu do servisu sho eksportuyetsya zastosunkom Pri rozgortanni riven marshrutizaciyi obroblyaye zapiti do zagalnodostupnogo hostu i perenapravlyaye yih do portu do yakogo priv yazano vebproces Yak pravilo ce realizuyetsya za dopomogoyu ogoloshennya zalezhnostej shlyahom dodavannya biblioteki vebservera do zastosunku napriklad Tornado dlya Python Thin dlya Ruby abo Jetty dlya Java ta inshih mov na osnovi JVM Ce vidbuvayetsya povnistyu v prostori koristuvacha tobto v kodi zastosunku Priv yazka do portu dlya obrobki zapitiv ye ugodoyu iz seredovishem vikonannya HTTP ne yedinij servis yakij mozhe buti eksportovanij shlyahom priv yazki do portu Majzhe bud yakij vid servernogo programnogo zabezpechennya mozhe buti zapushenij priv yazanij do portu i mozhe ochikuvati vhidni zapiti Prikladami ye ejabberd vikoristovuye XMPP i Redis vikoristovuye protokol Redis Takozh zvernit uvagu sho pidhid priv yazki do portiv oznachaye sho zastosunok mozhe vistupati yak storonnya sluzhba dlya inshogo zastosunku nadayuchi svoyu URL adresu yak resurs v konfiguraciyi zastosunku spozhivacha VIII Konkurentnist Bud yaka komp yuterna programa pislya zapusku predstavlena odnim abo dekilkoma procesami Vebdodatki mayut rizni formi vikonannya procesiv Napriklad PHP procesi vikonuyutsya yak dochirni procesi Apache yaki zapuskayutsya v razi potrebi v zalezhnosti vid navantazhennya Java procesi vikoristovuyut protilezhnij pidhid JVM zabezpechuye odin masivnij meta proces yakij rezervuye veliku kilkist sistemnih resursiv procesora i pam yati pid chas jogo zapusku i keruye konkurentnistyu vseredini sebe za dopomogoyu potokiv vikonannya threads V oboh vipadkah zapusheni procesi vidimi dlya rozrobnikiv zastosunku minimalno Masshtabuvannya virazhayetsya u viglyadi zapushenih procesiv riznomanitnist navantazhennya virazhayetsya v tipah procesiv V zastosunku dvanadcyati faktoriv procesi ye sutnostyami pershogo klasu Procesi v zastosunku dvanadcyati faktoriv vzyali silni storoni vid modeli procesiv UNIX dlya zapusku servisiv Vikoristovuyuchi cyu model rozrobnik mozhe sproektuvati svij zastosunok takim chinom sho dlya obrobki riznih robochih navantazhen neobhidno priznachiti kozhnomu vidu robit svij tip procesu Napriklad HTTP zapiti mozhut buti obrobleni za dopomogoyu vebprocesu web process a trivali fonovi zavdannya obrobleni robochim procesom worker process Ce ne viklyuchaye mozhlivosti vikoristannya individualnogo multipleksuvannya dlya okremih procesiv cherez potoki vikonannya virtualnoyi mashini abo asinhronni podiyevi modeli v takih instrumentah yak abo Node js Ale individualna virtualna mashina mozhe masshabuvatisya tilki obmezheno vertikalne masshabuvannya tomu zastosunok takozh povinen mati mozhlivist buti zapushenim yak dekilka procesiv na dekilkoh fizichnih mashinah Model pobudovana na procesah dijsno pokazuye sebe z najkrashogo boku koli postaye neobhidnist masshtabuvannya Vidsutnist rozdilenih danih i gorizontalne rozdilennya procesiv zastosunku dvanadcyati faktoriv oznachaye sho dodavannya bilshoyi konkurentnosti ye prostoyu i nadijnoyu operaciyeyu Masiv tipiv procesiv i kilkist procesiv kozhnogo tipu nazivayetsya formaciyeyu procesiv Procesi zastosunku dvanadcyati faktoriv nikoli ne mayut demonizuvatisya ta zapisuvati PID fajli Zamist cogo voni mayut pokladatisya na menedzher procesiv operacijnoyi sistemi napriklad systemd rozpodilenij menedzher procesiv na hmarnij platformi abo v procesi rozrobki na takij instrument yak dlya keruvannya potokom vivedennya reaguvannya na padinnya procesiv i obrobku inicijovanih koristuvachem perezavantazhennya chi zavershennya roboti IX Utilizovuvanist Procesi zastosunku dvanadcyati faktoriv ye utilizovuvanimi tobto voni mozhut buti zapusheni abo zupineni v bud yakij moment Ce spriyaye gnuchkomu masshtabuvannyu shvidkomu rozgortannyu kodu abo zminam konfiguraciyi i nadijnosti production rozgortannya Slid namagatisya minimizuvati chas zapusku procesiv V ideali chas mizh momentom vikonannya komandi zapusku procesu i momentom koli proces gotovij prijmati zapiti chi zadachi maye trivati lishe paru sekund Korotkij chas zapusku zabezpechuye bilshu gnuchkist dlya relizu i masshtabuvannya Krim togo ce pidvishuye stijkist oskilki menedzher procesiv mozhe legko peremishuvati procesi na novi fizichni mashini u razi neobhidnosti Procesi mayut korektno zavershuvati svoyu robotu koli voni otrimuyut SIGTERM signal vid dispetcheru procesiv Dlya vebprocesu korektne zavershennya roboti dosyagayetsya zavdyaki pripinennyu prosluhovuvannya portu do yakogo vin priv yazanij sho oznachaye vidmovu vid otrimannya bud yakih novih zapitiv zavershennyu obrobki bud yakih potochnih zapitiv ta zupinci samogo procesu V cij modeli peredbachayetsya sho HTTP zapiti korotki ne bilshe nizh kilka sekund a u razi dovgih zapitiv long polling kliyent maye namagatisya vidnoviti z yednannya u razi jogo vtrati Dlya procesu sho vikonuye fonovi zadachi worker korektne zavershennya roboti dosyagayetsya za rahunok povernennya potochnogo zavdannya nazad u chergu zadach Napriklad v RabbitMQ robochij proces mozhe nadislati komandu NACK v Beanstalkd zavdannya povertayetsya v chergu avtomatichno shorazu koli proces vtrachaye z yednannya Sistemi sho vikoristovuyut blokuvannya taki yak Delayed Job mayut buti povidomleni shob zvilniti blokuvannya zadachi V cij modeli peredbachayetsya sho vsi zadachi ye povtorno vhidnimi sho zazvichaj dosyagayetsya shlyahom obertannya rezultativ yihnoyi roboti v tranzakciyi abo shlyahom vikoristannya idempotentnih operacij Procesi takozh mayut buti stijki do raptovoyi zupinki v razi vidmovi aparatnih zasobiv na yakih voni zapusheni Hocha ce mensh jmovirna podiya nizh korektne zavershennya roboti za dopomogoyu signalu SIGTERM vona vse zh taki mozhe statisya Rekomendovanim pidhodom ye vikoristannya nadijnih cherg zavdan takih yak Beanstalkd yaki povertayut zavdannya v chergu zadach koli kliyenti vtrachayut z yednannya abo vid yednuyutsya po tajm autu U bud yakomu vipadku zastosunok dvanadcyati faktoriv maye proektuvatisya takim chinom shob obroblyati nespodivani ta nekorektni vimknennya Prikladom vdaloyi realizaciyi arhitekturi tilki avarijnogo vimknennya Crash only design ye CouchDB X Dev prod paritet Istorichno sklalosya sho ye suttyevi vidminnosti mizh development seredovishem rozrobnik vnosit zhivi zmini v lokalno rozgornutij zastosunok i production seredovishem do yakogo mayut dostup kincevi koristuvachi Ci vidminnosti proyavlyayutsya v troh oblastyah Riznicya v chasi Rozrobnik mozhe pracyuvati nad kodom yakij potrapit u production cherez dni tizhni abo navit misyaci Riznicya v personali Rozrobniki pishut kod Ops inzheneri rozgortayut jogo Riznicya v instrumentah Rozrobniki mozhut vikoristovuvati stek tehnologij takij yak Nginx SQLite ta OS X v toj chas yak na production vikoristovuyetsya Apache MySQL ta Linux Zastosunok dvanadcyati faktoriv proektuyetsya dlya bezperervnogo rozgortannya zavdyaki minimizaciyi riznici mizh production i development seredovishami Rozglyanemo tri vidminnosti opisani vishe Zmenshiti riznicyu v chasi rozrobnik mozhe napisati kod i vin bude rozgornutij cherez dekilka godin abo navit hvilin Zmenshiti riznicyu v personali rozrobniki yaki pisali kod berut aktivnu uchast v jogo rozgortanni i sposterigayut za jogo povedinkoyu na production Zmenshiti riznicyu v instrumentah trimati development ta production seredovisha maksimalno identichnimi Rezyumuyuchi skazane vishe v tablicyu Tradicijnij zastosunok Zastosunok dvanadcyati faktoriv Chas mizh rozgortannyami Tizhni Godini Avtor kodu toj hto rozgortaye Rizni lyudi Ti zh lyudi Dev Prod rozgortannya Rizni Maksimalno identichni Storonni sluzhbi taki yak bazi danih sistemi cherg povidomlen abo kesh ye odniyeyu z oblastej de dev prod paritet maye vazhlive znachennya Bagato mov programuvannya mayut biblioteki yaki sproshuyut dostup do storonnih sluzhb v tomu chisli adapteri dlya riznih vidiv servisiv Deyaki prikladi navedeni v tablici nizhche Tip Mova Biblioteka Adapteri Baza danih Ruby Rails ActiveRecord MySQL PostgreSQL SQLite Cherga povidomlen Python Django Celery RabbitMQ Beanstalkd Redis Kesh Ruby Rails ActiveSupport Cache Pam yat fajlova sistema Memcached Inodi rozrobniki bachat perevagi u vikoristanni legkih storonnih sluzhb v yihnomu lokalnomu seredovishi v toj chas yak bilsh serjozni i nadijni storonni sluzhbi budut vikoristovuvatisya u production Napriklad lokalno vikoristovuyut SQLite a na production PostgreSQL abo lokalno pam yat procesu dlya keshuvannya a na production Memcached Rozrobnik zastosunku dvanadcyati faktoriv unikaye vikoristannya riznih storonnih sluzhb v development i production seredovishah navit yaksho adapteri teoretichno abstragovani vid bud yakih vidminnostej u storonnih sluzhbah Vidminnosti mizh storonnimi sluzhbami oznachayut sho mozhe viniknuti krihitna nesumisnist v rezultati chogo kod yakij pracyuvav i projshov testuvannya v development ta staging seredovishah pislya rozgortannya ne pracyuye v production seredovishi Takij tip pomilok stvoryuye pereshkodi yaki nivelyuyut perevagi bezperervnogo rozgortannya Cina cih pereshkod i podalshogo vidnovlennya bezperervnogo rozgortannya nadzvichajno visoka yaksho rozglyadati v sukupnosti za ves chas ekspluataciyi zastosunku Vstanovlennya lokalno legkih storonnih servisiv vzhe ne ye takim privablivim yak bulo ranishe Suchasni nadijni storonni servisi taki yak Memcached PostgreSQL i RabbitMQ dosit legko vstanoviti i zapustiti zavdyaki suchasnim menedzheram pakunkiv takim yak Homebrew i apt get Krim togo deklarativni instrumenti pidgotovki seredovisha taki yak i Puppet u poyednanni z legkim virtualnim seredovishem takim yak Vagrant dozvolyayut rozrobnikam zapuskati lokalni seredovisha yaki nablizheni do production Cina vstanovlennya i vikoristannya cih sistem ye nizkoyu u porivnyanni z koristyu dev prod paritetu i bezperervnogo rozgortannya Adapteri dlya riznih storonnih servisiv vse zh korisni tomu sho voni roblyat perenesennya zastosunku dlya vikoristannya z inshimi storonnimi servisami vidnosno bezbolisnim Ale vsi rozgortannya zastosunku development staging ta production seredovisha mayut vikoristovuvati odin i toj samij tip i versiyu kozhnogo zi storonnih servisiv XI Zhurnalyuvannya Zhurnalyuvannya zabezpechuye naochne uyavlennya pro povedinku zapushenogo zastosunku Zazvichaj u servernih seredovishah zhurnali zapisuyutsya u fajl na disku logfile ale ce lishe odin z formativ vivedennya Zhurnal ce potik agregovanih vporyadkovanih za chasom podij zibranih z potokiv vivedennya vsih zapushenih procesiv i storonnih servisiv Zhurnal v siromu viglyadi yak pravilo maye tekstovij format z odniyeyu podiyeyu na kozhen ryadok hocha trasuvannya vinyatkiv mozhut zajmati kilka ryadkiv Zhurnali ne mayut fiksovanogo pochatku i kincya potik bezperervnij poki pracyuye zastosunok Zastosunok dvanadcyati faktoriv nikoli ne zajmayetsya marshrutizaciyu i zberigannyam svogo potoku vivedennya Zastosunok ne povinen zapisuvati zhurnal u fajl abo keruvati fajlami zhurnaliv Zamist cogo kozhen zapushenij proces zapisuye svij potik podij bez buferizaciyi v standartne vivedennya stdout V development seredovishi rozrobnik maye mozhlivist pereglyadati cej potik v terminali shob sposterigati za povedinkoyu zastosunku V staging ta production rozgortannyah potik vivedennya kozhnogo procesu perehoplyuyetsya seredovishem vikonannya zbirayetsya razom z usima inshimi potokami vivedennya zastosunku i spryamovuyetsya do odnogo abo kilkoh kincevih punktiv priznachennya dlya pereglyadu i dovgostrokovogo arhivuvannya Ci kincevi punkti priznachennya ne vidimi dlya zastosunku i ne nalashtovuyutsya nim voni keruyutsya seredovishem vikonannya Dlya cogo mozhut buti vikoristani marshrutizatori zhurnaliv z vidkritim vihidnim kodom napriklad ta Potik podij zastosunku mozhe buti napravlenij u fajl abo pereglyanutij u terminali v rezhimi realnogo chasu Najvazhlivishim ye te sho potik mozhe buti napravlenij u sistemu indeksuvannya i analizu zhurnaliv taku yak Splunk abo sistemu zberigannya danih zagalnogo priznachennya taku yak Hadoop Hive Ci sistemi mayut shiroki mozhlivosti i gnuchkist dlya detalnogo analizu povedinki zastosunku protyagom trivalogo chasu v tomu chisli Viyavlennya konkretnih podij u minulomu Pobudova grafikiv trendiv napriklad kilkist zapitiv za hvilinu Aktivne opovishennya vidpovidno do viznachenih koristuvachem evristichnih pravil napriklad poperedzhennya koli kilkist pomilok za hvilinu perevishuye pevnij porig XII Zadachi administruvannya Formaciya procesiv ye pevnim naborom procesiv yaki neobhidni dlya vikonannya regulyarnih zadach zastosunku napriklad obrobka vebzapitiv Razom z tim rozrobnikam chasto neobhidno vikonuvati razovi administrativni zadachi dlya obslugovuvannya zastosunku taki yak Zapusk migraciyi bazi danih napriklad manage py migrate v Django rake db migrate v Rails Zapusk konsoli REPL dlya vikonannya dovilnogo kodu abo perevirki modeli zastosunku na diyuchij bazi danih Bilshist mov nadayut REPL shlyahom zapusku interpretatora bez bud yakih argumentiv napriklad python abo perl abo v deyakih vipadkah mayut okremu komandu napriklad irb dlya Ruby rails console dlya Rails Zapusk razovih skriptiv zberezhenih v repozitoriyi zastosunku napriklad php scripts fix bad records php Razovi procesi administruvannya slid zapuskati v takomu zh seredovishi v yakomu zapusheni regulyarni trivali procesi zastosunku Voni zapuskayutsya na bazi relizu vikoristovuyuchi tu zh kodovu bazu i konfiguraciyu yak i bud yakij inshij proces na bazi cogo relizu Dlya uniknennya problem z sinhronizaciyeyu kod administruvannya maye postavlyatisya z kodom zastosunku Dlya vsih tipiv procesiv mayut vikoristovuvatisya odnakovi metodi izolyaciyi zalezhnostej Napriklad yaksho vebproces Ruby vikoristovuye komandu bundle exec thin start to dlya migraciyi bazi danih slid vikoristovuvati bundle exec rake db migrate Analogichno dlya programi na Python z Virtualenv slid vikoristovuvati bin python yak dlya zapusku vebservera Tornado tak i dlya zapusku bud yakih manage py procesiv administruvannya Metodologiya dvanadcyati faktoriv nadaye perevagu movam yaki mayut REPL z korobki i yaki dozvolyayut legko zapuskati razovi skripti U lokalnomu development seredovishi rozrobnik mozhe zapustiti proces administruvannya za dopomogoyu konsolnoyi komandi vseredini direktoriyi zastosunku U production seredovishi dlya zapusku takogo procesu rozrobniki mozhut vikoristovuvati ssh abo inshij mehanizm viddalenogo vikonannya komand sho nadayetsya seredovishem vikonannya Za mezhami dvanadcyati faktorivIsnuyut rozshirennya originalnoyi metodologiyi dvanadcyati faktoriv dlya pobudovi sitem priznachenih dlya rozgortannya v hmarnomu seredovishi tak zvanih cloud native sistem Do dvanadcyati originalnih faktoriv dodayutsya she tri Telemetriya Bezpeka i koncepciya Spochatku API Spochatku API Cej faktor viznachaye sho toj produkt sho rozroblyayetsya yavlyaye soboyu API yakij v svoyu chergu maye kliyentiv tobto vikoristovuyetsya inshimi zastosunkami chi servisami Napriklad toj zhe grafichnij interfejs chi to mobilnij chi veb ye nichim inshim nizh prosto spozhivachem yakogos API Pidhid Spochatku API ye vazhlivoyu skladovoyu rozrobki nativnih hmarnih cloud native sistem i zastosunkiv yaki bazuyutsya na mikroservisnij chi servis oriyentovnij arhitekturi Isnuye bezlich instrumentiv i standartiv dlya pidtrimki rozrobki v stili Spochatku API Napriklad standartnij format dlya specifikacij API sho vikoristuvuye rozmitkovij sintaks Cej format ye bilsh prochitnim nizh JSON chi WSDL i mozhe buti vikoristanij kodom dlya generuvannya dokumentaciyi abo navit dlya stvorennya servernih mokiv V toj zhe chas nabir instrumentiv na kshtalt nadaye mozhlivosti taki yak integraciya z GitHub i generuvannya mokiv Napriklad yaksho ye neobhidnist v stvorenni kliyenta dlya API vse sho treba ce nadati posilannya Apiary de vona zmozhe prochitati pobachiti priklad kodu dlya spozhivannya danogo API i navit vikonati zapiti na zapushennij mok Telemetriya Rozgortannya zastosunku na lokalnij mashini daye zmogu sposterigati sho vidbuvayetsya vseredini zapushenoyi sistemi znevadzhuvati ta vikoristovuvati sotni instrumentiv sho dayut zmogu zazirnuti v glibini zastosunku Ale sistemi yaki rozgornuti v hmarnomu seredovishi ne nadayut takih mozhlivostej Tomu duzhe vazhlivo mati instrumenti yaki dozvolyat viddaleno monitoriti stan sistemi v hmari Vidilyayut kilka kategorij danih dlya vidslidkovuvannya Monitoring produktivnosti Domenno specifichna telemetriya Zdorov ya ta sistemni zhurnali Autentifikaciya ta avtorizaciya Originalna koncepciya dvanadcyati faktoriv ne govorit nichogo pro bezpeku yaka ye zhittyevo vazhlivim elementom bud yakogo zastosunku chi hmarnogo seredovisha Cloud native sistema zavzhdi povinna buti bezpechnoyu ta zahishenoyu sistemoyu V idealnomu sviti vsi zapiti do zastosunku mayut buti zahisheni kontrolem dostupu za rolyami role based access control Zastosunok povinen znati vid kogo prijshov zapit i yaki roli maye cej spozhivach Ci roli diktuyut chi maye cej kliyent dostup do danogo funkcionalu chi informaciyi chi ni Za dopomogoyu takih instrumentiv yak OAuth2 OpenID Connect riznomanitni SSO serveri i standarti biblioteki avtorizaciyi i autentifikaciyi bezpeka maye buti chimos sho narodzhuyetsya v pershij zhe den rozrobki proektu i ne povinna buti chimos sho prikruchuyetsya v prodaksheni PosilannyaWiggins Adam 12factor net angl Arhiv originalu za 31 bereznya 2019 Procitovano 30 sichnya 2018 Hoffman Kevin 2016 Beyond the Twelve Factor App English Beijing Boston Farnham Sebastopol Tokyo O Reilly Media Inc ISBN 978 1 491 94401 1