diff --git a/.gitignore b/.gitignore index 365e22148..8c9e75ddf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .rvmrc .bundle .tool-versions +.idea diff --git a/content/uk/admin-processes.md b/content/uk/admin-processes.md index 19b876297..cfb81a802 100644 --- a/content/uk/admin-processes.md +++ b/content/uk/admin-processes.md @@ -1,14 +1,28 @@ ## XII. Задачі адміністрування ### Виконуйте задачі адміністрування/керування за допомогою разових процесів -[Формація процесів](./concurrency) є певним набором процесів, які необхідні для виконання регулярних задач застосунку (наприклад, обробка веб-запитів). Разом з тим, розробникам часто необхідно виконувати разові адміністративні задачі для обслуговування застосунку, такі як: +[Формація процесів](./concurrency) є певним набором процесів, які необхідні для виконання регулярних задач застосунку +(наприклад, обробка веб-запитів). Разом з тим, розробникам часто необхідно виконувати разові адміністративні задачі +для обслуговування застосунку, такі як: * Запуск міграції бази даних (наприклад, `manage.py migrate` в Django, `rake db:migrate` в Rails). -* Запуск консолі ([REPL](http://en.wikipedia.org/wiki/Read-eval-print_loop)) для виконання довільного коду або перевірки моделі застосунку на діючій базі даних. Більшість мов надають REPL шляхом запуску інтерпретатора без будь-яких аргументів (наприклад, `python` або `perl`) або в деяких випадках мають окрему команду (наприклад, `irb` для Ruby, `rails console` для Rails). +* Запуск консолі ([REPL](http://en.wikipedia.org/wiki/Read-eval-print_loop)) для виконання довільного коду +* або перевірки моделі застосунку на робочій базі даних. Більшість мов надають REPL шляхом запуску інтерпретатора без +* будь-яких аргументів (наприклад, `python` або `perl`) або в деяких випадках мають окрему команду +* (наприклад, `irb` для Ruby, `rails console` для Rails). * Запуск разових скриптів, збережених в репозиторії застосунку (наприклад, `php scripts/fix_bad_records.php`). -Разові процеси адміністрування слід запускати в такому ж середовищі, в якому запущені регулярні [тривалі процеси](./processes) застосунку. Вони запускаються на базі [релізу](./build-release-run), використовуючи ту ж [кодову базу](./codebase) і [конфігурацію](./config), як і будь-який інший процес на базі цього релізу. Для уникнення проблем з синхронізацією код адміністрування має поставлятися з кодом застосунку. +Разові процеси адміністрування слід запускати в такому ж середовищі, в якому запущені регулярні +[тривалі процеси](./processes) застосунку. Вони запускаються на базі [релізу](./build-release-run), +використовуючи ту ж [кодову базу](./codebase) і [конфігурацію](./config), як і будь-який інший процес на базі цього релізу. +Для уникнення проблем з синхронізацією код адміністрування має поставлятися з кодом застосунку. -Для всіх типів процесів мають використовуватися однакові методи [ізоляції залежностей](./dependencies). Наприклад, якщо веб-процес Ruby використовує команду `bundle exec thin start`, то для міграції бази даних слід використовувати `bundle exec rake db:migrate`. Аналогічно, для програми на Python з Virtualenv слід використовувати `bin/python` як для запуску веб-сервера Tornado, так і для запуску будь-яких `manage.py` процесів адміністрування. +Для всіх типів процесів мають використовуватися однакові методи [ізоляції залежностей](./dependencies). +Наприклад, якщо вебпроцес Ruby використовує команду `bundle exec thin start`, то для міграції бази даних слід +використовувати `bundle exec rake db:migrate`. Аналогічно, для програми на Python з Virtualenv слід використовувати +`bin/python` як для запуску вебсервер Tornado, так і для запуску будь-яких `manage.py` процесів адміністрування. -Методологія дванадцяти факторів надає перевагу мовам, які мають REPL "з коробки", і які дозволяють легко запускати разові скрипти. У локальному development середовищі розробник може запустити процес адміністрування за допомогою консольної команди всередині директорії застосунку. У production середовищі для запуску такого процесу розробники можуть використовувати ssh або інший механізм віддаленого виконання команд, що надається середовищем виконання. \ No newline at end of file +Методологія дванадцяти факторів надає перевагу мовам, які мають REPL "з коробки", і які дозволяють легко запускати +разові скрипти. У локальному development середовищі розробник може запустити процес адміністрування за допомогою +консольної команди всередині директорії застосунку. У production середовищі для запуску такого процесу розробники +можуть використовувати ssh або інший механізм віддаленого виконання команд, що надається середовищем виконання. \ No newline at end of file diff --git a/content/uk/background.md b/content/uk/background.md index fb1c16ccf..dc8ba1081 100644 --- a/content/uk/background.md +++ b/content/uk/background.md @@ -1,8 +1,17 @@ Передумови ========== -Люди, що працювали над цим документом, брали безпосередню участь в розробці і розгортанні сотень застосунків, і мимоволі стали свідками розвитку, експлуатації та масштабування сотень тисяч застосунків під час нашої роботи над платформою [Heroku](http://www.heroku.com/). +Люди, що працювали над цим документом, брали безпосередню участь в розробці й розгортанні сотень застосунків, +і мимоволі стали свідками розвитку, експлуатації та масштабування сотень тисяч застосунків під час нашої роботи над +платформою [Heroku](http://www.heroku.com/). -В цьому документі узагальнюється весь наш досвід використання і спостереження за найрізноманітнішими SaaS-застосунками "в дикій природі". Документ об'єднує ідеальні практики розробки застосунків, особлива увага приділяється динаміці органічного росту застосунку з плином часу, взаємодії між розробниками, які працюють над кодом застосунку, та [уникненню витрат при ерозії програмного забезпечення](http://blog.heroku.com/archives/2011/6/28/the_new_heroku_4_erosion_resistance_explicit_contracts/). +В цьому документі узагальнюється весь наш досвід використання і спостереження за найрізноманітнішими SaaS-застосунками +"в дикій природі". Документ об'єднує ідеальні практики розробки застосунків, особлива увага приділяється +динаміці органічного росту застосунку з плином часу, взаємодії між розробниками, які працюють над кодом застосунку, +та [уникненню витрат при ерозії програмного забезпечення](http://blog.heroku.com/archives/2011/6/28/the_new_heroku_4_erosion_resistance_explicit_contracts/). -Наша мета полягає в тому, щоб підвищити обізнаність про деякі системні проблеми, які ми бачили в практиці розробки сучасних застосунків, а також в тому, щоб сформулювати спільні загальні поняття для обговорення цих проблем, і запропонувати набір загальних концептуальних рішень цих проблем з супутньою термінологією. Формат навіяний книгами Мартіна Фаулера (Martin Fowler) *[Patterns of Enterprise Application Architecture](https://books.google.com/books/about/Patterns_of_enterprise_application_archi.html?id=FyWZt5DdvFkC)* та *[Refactoring](https://books.google.com/books/about/Refactoring.html?id=1MsETFPD3I0C)*. \ No newline at end of file +Наша мета полягає в тому, щоб підвищити обізнаність про деякі системні проблеми, які ми бачили в практиці розробки +сучасних застосунків, а також в тому, щоб сформулювати спільні загальні поняття для обговорення цих проблем, +і запропонувати набір загальних концептуальних розв'язань цих проблем з супутньою термінологією. +Формат навіяний книгами Мартіна Фаулера +(Martin Fowler) *[Patterns of Enterprise Application Architecture](https://books.google.com/books/about/Patterns_of_enterprise_application_archi.html?id=FyWZt5DdvFkC)* та *[Refactoring](https://books.google.com/books/about/Refactoring.html?id=1MsETFPD3I0C)*. \ No newline at end of file diff --git a/content/uk/backing-services.md b/content/uk/backing-services.md index ee2457558..e1723553e 100644 --- a/content/uk/backing-services.md +++ b/content/uk/backing-services.md @@ -1,14 +1,37 @@ ## IV. Сторонні служби ### Вважайте сторонні служби (backing services) підключеними ресурсами -*Стороння служба* — це будь-яка служба, яка доступна застосунку по мережі і необхідна для його нормальної роботи: бази даних (наприклад, [MySQL](http://dev.mysql.com/) або [CouchDB](http://couchdb.apache.org/)), системи черг повідомлень (наприклад, [RabbitMQ](http://www.rabbitmq.com/) або [Beanstalkd](https://beanstalkd.github.io)), служби SMTP для вихідної пошти (наприклад, [Postfix](http://www.postfix.org/)), системи кешування (наприклад, [Memcached](http://memcached.org/)) тощо. +*Стороння служба* — це будь-яка служба, яка доступна застосунку мережею і необхідна для його нормальної роботи: +бази даних (наприклад, [MySQL](http://dev.mysql.com/) або [CouchDB](http://couchdb.apache.org/)), +системи черг повідомлень (наприклад, [RabbitMQ](http://www.rabbitmq.com/) або [Beanstalkd](https://beanstalkd.github.io)), +служби SMTP для вихідної пошти (наприклад, [Postfix](http://www.postfix.org/)), системи кешування +(наприклад, [Memcached](http://memcached.org/)) тощо. -Допоміжні служби, такі як бази даних, традиційно управляються тими ж системними адміністраторами, які розгортають застосунок. Окрім локальних служб, застосунок може також використовувати служби, що надаються і керуються третіми сторонами: SMTP-сервіси (наприклад, [Postmark](http://postmarkapp.com/)), сервіси збору метрик (наприклад, [New Relic](http://newrelic.com/) або [Loggly](http://www.loggly.com/)), сховища бінарних даних (наприклад, [Amazon S3](http://aws.amazon.com/s3/)), а також різні сервіси, що надають доступ через API (наприклад, [Twitter](http://dev.twitter.com/), [Google Maps](https://developers.google.com/maps/), або [Last.fm](http://www.last.fm/api)). +Допоміжні служби, такі як бази даних, традиційно управляються тими ж системними адміністраторами, +які розгортають застосунок. Окрім локальних служб, застосунок може також використовувати служби, +що надаються і керуються третіми сторонами: SMTP-сервіси (наприклад, [Postmark](http://postmarkapp.com/)), +сервіси збору метрик (наприклад, [New Relic](http://newrelic.com/) або [Loggly](http://www.loggly.com/)), +сховища бінарних даних (наприклад, [Amazon S3](http://aws.amazon.com/s3/)), +а також різні сервіси, що надають доступ через API (наприклад, [Twitter](http://dev.twitter.com/), +[Google Maps](https://developers.google.com/maps/), або [Last.fm](http://www.last.fm/api)). -**Код застосунку дванадцяти факторів не бачить жодних відмінностей між локальними і сторонніми сервісами.** Для застосунку кожен з них є підключеним ресурсом, доступним за URL-адресою або іншими даними, що зберігаються в [конфігурації](./config). [Розгортання](./codebase) застосунку дванадцяти факторів повинно мати можливість, наприклад, замінити локальну базу даних MySQL на будь-яку керовану третьою стороною (наприклад, [Amazon RDS](http://aws.amazon.com/rds/)) без жодних змін в коді застосунку. Крім того, локальний сервер SMTP може бути замінений на сторонній SMTP-сервіс (наприклад, Postmark) без зміни коду. В обох випадках необхідно змінити лише налаштування відповідного ресурсу в конфігурації застосунку. +**Код застосунку дванадцяти факторів не бачить жодних відмінностей між локальними й сторонніми сервісами. +** Для застосунку кожен з них є підключеним ресурсом, доступним за URL-адресою або іншими даними, +що зберігаються в [конфігурації](./config). [Розгортання](./codebase) застосунку дванадцяти факторів повинно мати можливість, +наприклад, замінити локальну базу даних MySQL на будь-яку керовану третьою стороною +(наприклад, [Amazon RDS](http://aws.amazon.com/rds/)) без жодних змін в коді застосунку. Крім того, +локальний сервер SMTP може бути замінений на сторонній SMTP-сервіс (наприклад, Postmark) без зміни коду. +В обох випадках необхідно змінити лише налаштування відповідного ресурсу в конфігурації застосунку. -Кожна окрема стороння служба є *ресурсом*. Наприклад, база даних MySQL є ресурсом; дві бази даних MySQL (що використовуються для шардінгу на рівні застосунку) кваліфікуються як два різних ресурси. Застосунок дванадцяти факторів сприймає ці бази даних як *підключені ресурси*, що вказує на їхній слабкий зв'язок з розгортанням, в якому вони підключені. +Кожна окрема стороння служба є *ресурсом*. Наприклад, база даних MySQL є ресурсом; дві бази даних MySQL +(що використовуються для шардінгу на рівні застосунку) кваліфікуються як два різних ресурси. Застосунок дванадцяти +факторів сприймає ці бази даних як *підключені ресурси*, що вказує на їхній слабкий зв'язок з розгортанням, +в якому вони підключені. - + -Ресурси за необхідності можуть бути підключені та відключені до розгортання застосунку. Наприклад, якщо база даних застосунку функціонує некорекно у зв'язку з апаратними проблемами, адміністратор може запустити новий сервер бази даних, відновленої з останньої резервної копії. Поточна база даних може бути відключена, а нова база даних підключена — все це без будь-яких змін коду. +Ресурси за необхідності можуть бути підключені та відключені до розгортання застосунку. +Наприклад, якщо база даних застосунку функціонує некоректно у зв'язку з апаратними проблемами, +адміністратор може запустити новий сервер бази даних, відновленої з останньої резервної копії. +Поточна база даних може бути відключена, а нова база даних підключена — все це без будь-яких змін коду. diff --git a/content/uk/build-release-run.md b/content/uk/build-release-run.md index eaaed6b44..1cb2a7928 100644 --- a/content/uk/build-release-run.md +++ b/content/uk/build-release-run.md @@ -3,16 +3,30 @@ [Кодова база](./codebase) перетворюється в розгортання (крім розгортання для розробки) у три етапи: -* *Етап збірки* — це трансформація, яка перетворює код в репозиторії у пакунок, що може бути запущений, і який називається *збірка*. Використовуючи версію коду за вказаним у процесі розгортання коммітом, етап збірки завантажує [залежності](./dependencies) та компілює бінарні файли і ресурси (assets). -* *Етап релізу* приймає збірку, отриману на етапі збірки, і об'єднує її з поточною [конфігурацією](./config) розгортання. Отриманий *реліз* містить збірку і конфігурацію і готовий до негайного запуску в середовищі виконання. -* *Етап виконання* (також відомий як "runtime") запускає застосунок у середовищі виконання, увімкнувши деякий набір [процесів](./processes) застосунку з певного релізу. +* *Етап збірки* — це трансформація, яка перетворює код в репозиторії у пакунок, що може бути запущений, +і який називається *збірка*. Використовуючи версію коду за вказаним у процесі розгортання коммітом, +етап збірки завантажує [залежності](./dependencies) та компілює бінарні файли й ресурси (assets). +* *Етап релізу* приймає збірку, отриману на етапі збірки, і об'єднує її з поточною [конфігурацією](./config) розгортання. +Отриманий *реліз* містить збірку і конфігурацію і готовий до негайного запуску в середовищі виконання. +* *Етап виконання* (також відомий як "runtime") запускає застосунок у середовищі виконання, +увімкнувши деякий набір [процесів](./processes) застосунку з певного релізу. ![Код стає збіркою, яка поєднується з конфігурацією для створення релізу.](/images/release.png) -**Застосунок дванадцяти факторів дотримується суворого відокремлення етапів збірки, релізу і виконання.** Наприклад, не можна вносити зміни в код під час етапу виконання, оскільки немає способу поширити ці зміни назад на етап збірки. +**Застосунок дванадцяти факторів дотримується суворого відокремлення етапів збірки, релізу і виконання.** Наприклад, +не можна вносити зміни в код під час етапу виконання, оскільки немає способу поширити ці зміни назад на етап збірки. -Інструменти розгортання, як правило, надають засоби керування релізами, які дають можливість відкату до попередньої версії. Наприклад, інструмент розгортання [Capistrano](https://github.com/capistrano/capistrano/wiki) зберігає релізи в підкаталог з назвою `releases`, де поточний реліз є символічним посиланням на каталог поточного релізу. Команда Capistrano `rollback` дає можливість швидко виконати відкат до попередньої версії. +Інструменти розгортання, як правило, надають засоби керування релізами, які дають можливість повернення до попередньої версії. +Наприклад, інструмент розгортання [Capistrano](https://github.com/capistrano/capistrano/wiki) зберігає релізи +в підкаталог з назвою `releases`, де поточний реліз є символічним посиланням на каталог поточного релізу. +Команда Capistrano `rollback` дає можливість швидко виконати повернення до попередньої версії. -Кожен реліз повинен завжди мати унікальний ідентифікатор, наприклад, мітку часу релізу (наприклад, `2011-04-06-20:32:17`) або номер, що зростає (наприклад, `v100`). Релізи можуть тільки додаватися, неможливо змінити реліз після його створення. Будь-які зміни мають створювати новий реліз. +Кожен реліз повинен завжди мати унікальний ідентифікатор, наприклад, мітку часу релізу (наприклад, `2011-04-06-20:32:17`) +або номер, що зростає (наприклад, `v100`). Релізи можуть тільки додаватися, неможливо змінити реліз після його створення. +Будь-які зміни мають створювати новий реліз. -Збірка ініцюється розробником застосунку щоразу при розгортанні нового коду. Запуск етапу виконання, навпаки, може відбуватися автоматично в таких випадках, як перезавантаження сервера або перезапуск процесу, шо впав, менеджером процесів. Таким чином, етап виконання має бути максимально технічно простим, бо проблеми, які заважають застосунку запуститися, можуть призвести до його зупинки посеред ночі, коли розробників немає на місці. Етап збірки може бути більш складним, бо можливі помилки завжди видимі розробнику, який запустив процес розгортання. \ No newline at end of file +Збірка ініціюється розробником застосунку щоразу при розгортанні нового коду. Запуск етапу виконання, навпаки, +може відбуватися автоматично в таких випадках, як перезавантаження сервера або перезапуск процесу, що впав, +менеджером процесів. Таким чином, етап виконання має бути максимально технічно простим, бо проблеми, +які заважають застосунку запуститися, можуть призвести до його зупинки посеред ночі, коли розробників немає на місці. +Етап збірки може бути більш складним, бо можливі помилки завжди видимі розробнику, який запустив процес розгортання. \ No newline at end of file diff --git a/content/uk/codebase.md b/content/uk/codebase.md index 75e86bf68..391abedde 100644 --- a/content/uk/codebase.md +++ b/content/uk/codebase.md @@ -1,17 +1,30 @@ ## I. Кодова база -### Одна кодова база, що відслідковується в системі контролю версій та має багато розгортань +### Одна кодова база, що відстежується в системі контролю версій та має багато розгортань -Застосунок дванадцяти факторів завжди відслідковуються в системі контролю версій, такій як [Git](http://git-scm.com/), [Mercurial](https://www.mercurial-scm.org/) або [Subversion](http://subversion.apache.org/). Копія бази даних відстеження ревізій називається *репозиторій коду (code repository)*, що часто скорочується до *code repo* або просто *repo*. +Застосунок дванадцяти факторів завжди відстежується в системі контролю версій, +такій як [Git](http://git-scm.com/), [Mercurial](https://www.mercurial-scm.org/) +або [Subversion](http://subversion.apache.org/). Копія бази даних відстеження ревізій називається +*репозиторій коду (code repository)*, що часто скорочується до *code repo* або просто *repo*. -*Кодова база* — це один репозиторій (в централізованих системах контролю версій, як Subversion), або декілька репозиторіїв, які мають спільний початковий комміт (в децентралізованих системах контролю версій, як Git). +*Кодова база* — це один репозиторій (в централізованих системах контролю версій, як Subversion), +або декілька репозиторіїв, які мають спільний початковий комміт (в децентралізованих системах контролю версій, як Git). -![Одна кодова база — багатьо розгортань](/images/codebase-deploys.png) +![Одна кодова база — багато розгортань](/images/codebase-deploys.png) Завжди існує однозначна відповідність між кодовою базою і застосунком: -* За наявності кількох баз коду, це не застосунок, це — розподілена система. Кожен компонент в розподіленій системі є застосунком, і кожен з них може окремо дотримуватися дванадцяти факторів. -* Кілька різних застосунків, що спільно використовують загальну базу коду, є порушенням дванадцяти факторів. Рішенням в даній ситуації є виділення загального коду в бібліотеки, які можуть бути підключені через [менеджер залежностей](./dependencies). +* За наявності кількох баз коду, це не застосунок, це — розподілена система. Кожен компонент в розподіленій системі +* є застосунком, і кожен з них може окремо дотримуватися дванадцяти факторів. +* Кілька різних застосунків, що спільно використовують загальну базу коду, є порушенням дванадцяти факторів. +* Рішенням в даній ситуації є виділення загального коду в бібліотеки, +які можуть бути підключені через [менеджера залежностей](./dependencies). -Існує тільки одна кодова база для кожного застосунку, але може бути багато розгортань одного і того самого застосунку. *Розгортанням (deploy)* є запущений екземпляр застосунку. Це, як правило, production-сайт і один або більше staging-сайтів (проміжних розгортань). Крім того, розробник має копію застосунку, запущеного в його локальному середовищі розробки. Кожну з таких копій також можна кваліфікувати як розгортання (deploy). +Існує тільки одна кодова база для кожного застосунку, але може бути багато розгортань одного і того самого застосунку. +*Розгортанням (deploy)* є запущений екземпляр застосунку. Це, як правило, production-сайт і один або більше +staging-сайтів (проміжних розгортань). Крім того, розробник має копію застосунку, запущеного в його локальному +середовищі розробки. Кожну з таких копій також можна кваліфікувати як розгортання (deploy). -Кодова база має бути єдина для всіх розгортань, хоча в кожному розгортанні можуть бути активні різні її версії. Наприклад, розробник може мати деякі зміни у коді, які ще не додані в staging-розгортання; staging-розгортання може мати деякі зміни, які ще не додані в production-розгортання. Але всі вони використовують одну і ту саму кодову базу, таким чином можна їх ідентифікувати як різні розгортання одного і того ж застосунку. \ No newline at end of file +Кодова база має бути єдина для всіх розгортань, хоча в кожному розгортанні можуть бути активні різні її версії. +Наприклад, розробник може мати деякі зміни у коді, які ще не додані в staging-розгортання; +staging-розгортання може мати деякі зміни, які ще не додані в production-розгортання. Але всі вони використовують +одну і ту саму кодову базу, таким чином можна їх ідентифікувати як різні розгортання одного і того ж застосунку. \ No newline at end of file diff --git a/content/uk/concurrency.md b/content/uk/concurrency.md index de609a2c8..0cff514ff 100644 --- a/content/uk/concurrency.md +++ b/content/uk/concurrency.md @@ -1,14 +1,36 @@ ## VIII. Конкурентність ### Масштабуйте застосунок за допомогою процесів -Будь-яка комп'ютерна програма після запуску представлена одним або декількома процесами. Веб-додатки мають різні форми виконання процесів. Наприклад, PHP-процеси виконуються як дочірні процеси Apache, які запускаються в разі потреби в залежності від навантаження. Java-процеси використовують протилежний підхід: JVM забезпечує один масивний мета-процес, який резервує велику кількість системних ресурсів (процесора і пам'яті) під час його запуску, і керує конкурентністю всередині себе за допомогою потоків виконання (threads). В обох випадках запущені процеси видимі для розробників застосунку мінімально. +Будь-яка комп'ютерна програма після запуску представлена одним або декількома процесами. +Вебдодатки мають різні форми виконання процесів. Наприклад, PHP-процеси виконуються як дочірні процеси Apache, +які запускаються в разі потреби в залежності від навантаження. Java-процеси використовують протилежний підхід: +JVM забезпечує один масивний метапроцес, який резервує велику кількість системних ресурсів (процесора і пам'яті) +під час його запуску, і керує конкурентністю всередині себе за допомогою потоків виконання (threads). +В обох випадках запущені процеси видимі для розробників застосунку мінімально. ![Масштабування виражається у вигляді запущених процесів, різноманітність навантаження виражається в типах процесів.](/images/process-types.png) -**В застосунку дванадцяти факторів, процеси є сутностями першого класу.** Процеси в застосунку дванадцяти факторів взяли сильні сторони від [моделі процесів UNIX для запуску сервісів](https://adam.herokuapp.com/past/2011/5/9/applying_the_unix_process_model_to_web_apps/). Використовуючи цю модель, розробник може спроектувати свій застосунок таким чином, що для обробки різних робочих навантажень необхідно призначити кожному виду робіт свій *тип процесу*. Наприклад, HTTP-запити можуть бути оброблені за допомогою веб-процесу (web process), а тривалі фонові завдання оброблені робочим процесом (worker process). +**В застосунку дванадцяти факторів, процеси є сутностями першого класу. +** Процеси в застосунку дванадцяти факторів взяли сильні сторони від [моделі процесів UNIX для запуску сервісів](https://adam.herokuapp.com/past/2011/5/9/applying_the_unix_process_model_to_web_apps/). +Використовуючи цю модель, розробник може спроєктувати свій застосунок таким чином, що для обробки різних робочих +навантажень необхідно призначити кожному виду робіт свій *тип процесу*. Наприклад, HTTP-запити можуть бути оброблені +за допомогою вебпроцесу (web process), а тривалі фонові завдання оброблені робочим процесом (worker process). -Це не виключає можливості використання індивідуального мультиплексування для окремих процесів через потоки виконання віртуальної машини або асинхронні/подієві моделі в таких інструментах, як [EventMachine](https://github.com/eventmachine/eventmachine), [Twisted](http://twistedmatrix.com/trac/) або [Node.js](http://nodejs.org/). Але індивідуальна віртуальна машина може масшабуватися тільки обмежено (вертикальне масшабування), тому застосунок також повинен мати можливість бути запущеним як декілька процесів на декількох фізичних машинах. +Це не виключає можливості використання індивідуального мультиплексування для окремих процесів через потоки виконання +віртуальної машини або асинхронні/подієві моделі в таких інструментах, +як [EventMachine](https://github.com/eventmachine/eventmachine), [Twisted](http://twistedmatrix.com/trac/) +або [Node.js](http://nodejs.org/). Але індивідуальна віртуальна машина може масштабуватися тільки обмежено +(вертикальне масштабування), тому застосунок також повинен мати можливість бути запущеним як декілька процесів +на декількох фізичних машинах. -Модель, побудована на процесах, дійсно показує себе з найкращого боку, коли постає необхідність масштабування. [Відсутність розділених даних і горизонтальне розділення процесів застосунку дванадцяти факторів](./processes) означає, що додавання більшої конкурентності є простою і надійною операцією. Масив типів процесів і кількість процесів кожного типу називається *формацією процесів*. +Модель, побудована на процесах, дійсно показує себе з найкращого боку, коли постає необхідність масштабування. +[Відсутність розділених даних і горизонтальне розділення процесів застосунку дванадцяти факторів](./processes) означає, +що додавання більшої конкурентності є простою і надійною операцією. Масив типів процесів і кількість процесів кожного +типу називається *формацією процесів*. -Процеси застосунку дванадцяти факторів [ніколи не мають демонізуватися](http://dustin.github.com/2010/02/28/running-processes.html) та записувати PID-файли. Замість цього вони мають покладатися на менеджер процесів операційної системи (наприклад, [systemd](https://www.freedesktop.org/wiki/Software/systemd/), розподілений менеджер процесів на хмарній платформі, або в процесі розробки на такий інструмент, як [Foreman](http://blog.daviddollar.org/2011/05/06/introducing-foreman.html)) для керування [потоком виведення](./logs), реагування на падіння процесів і обробку ініційованих користувачем перезавантаження чи завершення роботи. +Процеси застосунку дванадцяти факторів [ніколи не мають демонізуватися](http://dustin.github.com/2010/02/28/running-processes.html) +та записувати PID-файли. Замість цього вони мають покладатися на менеджера процесів операційної системи +(наприклад, [systemd](https://www.freedesktop.org/wiki/Software/systemd/), розподілений менеджер процесів на хмарній +платформі, або в процесі розробки на такий інструмент, як [Foreman](http://blog.daviddollar.org/2011/05/06/introducing-foreman.html)) +для керування [потоком виведення](./logs), реагування на падіння процесів і обробку ініційованих користувачем +перезавантаження чи завершення роботи. diff --git a/content/uk/config.md b/content/uk/config.md index 8205ba784..ea753cec5 100644 --- a/content/uk/config.md +++ b/content/uk/config.md @@ -1,22 +1,45 @@ ## III. Конфігурація ### Зберігайте конфігурацію в середовищі виконання -*Конфігурація* застосунку — це все, що може змінюватися між [розгортаннями](./codebase) (staging-розгортання, production-розгортання, локальне середовище розробника тощо). Це включає: +*Конфігурація* застосунку — це все, що може змінюватися між +[розгортаннями](./codebase) (staging-розгортання, production-розгортання, локальне середовище розробника тощо). +Це включає: * Параметри підключення до бази даних, Memcached і інших [сторонніх сервісів](./backing-services); * Реєстраційні дані для підключення до зовнішніх сервісів, таких як Amazon S3 або Twitter; * Значення, що залежать від середовища розгортання, такі як канонічне ім'я хосту. -Застосунки іноді зберігають конфігурації як константи в коді. Це є порушенням методології дванадцяти факторів, яка вимагає **обов'язкового відокремлення конфігурації від коду**. Конфігурації застосунку в розгортаннях суттєво відрізняються, код — однаковий. - -Лакмусовим папірцем того, чи правильно розділені конфігурація і код, є можливість в будь-який момент відкрити вихідний код застосунку у вільний доступ, при цьому не оприлюднюючи будь-яких приватних даних. - -Зверніть увагу, що визначення "конфігурації" **не включає** в себе внутрішні налаштування застосунку, такі як `сonfig/routes.rb` в Rails, або [як пов'язані основні модулі](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html) в [Spring](http://spring.io/). Ці налаштування не змінюються між розгортаннями, і тому краще місце для них — саме в коді. - -Іншим підходом до конфігурації є використання конфігураційних файлів, що не зберігаються в систему контролю версій, таких як `сonfig/database.yml` в Rails. Це перевага у порівнянні з використанням констант в коді, але все ж таки має суттєві недоліки: є ймовірність помилково зберегти файл конфігурації в репозиторій; існує тенденція коли конфігураційні файли розкидані в різних місцях і в різних форматах, і стає важко передивлятися всі налаштування і керувати ними в одному місці. Крім того, формати цих файлів, як правило, специфічні для конкретної мови програмування чи фреймворку. - -**Застосунок дванадцати факторів зберігає конфігурацію в *змінних оточення*** (часто скорочується до *env vars* або *env*). Значення змінних оточення легко змінити між розгортаннями без зміни коду; на відміну від конфігураційних файлів, менш ймовірно випадково зберегти їх в репозиторій коду; і на відміну від конфігураційних файлів або інших механізмів конфігурації, таких як Java System Properties, вони є стандартом, незалежним від мови програмування чи фреймворку. - -Іншим аспектом керування конфігурацією є групування. Іноді застосунки об'єднують конфігурації в іменовані групи (які часто називаються "оточеннями"), які називаються в залежності від конкретного розгортання, наприклад, `development`, `test` і `production` оточення в Rails. Цей метод погано масштабується: чим більше створюється різних розгортань застосунку, тим більше необхідно нових імен оточень, наприклад, `staging` або `qa`. При подальшому рості проекту розробники можуть додавати свої власні спеціальні оточення, наприклад, `joes-staging`, що призводить до комбінаторного вибуху конфігурації, який робить керування розгортанням застосунку нестабільним. - -У застосунку дванадцяти факторів змінні оточення є незв'язаними між собою засобами керування. Кожна змінна повністю незалежна від інших. Вони ніколи не групуються разом в "оточення", керування ними здійснюється незалежно для кожного розгортання. Ця модель добре масштабується разом з появою більшої кількості розгортань застосунку протягом його експлуатації. \ No newline at end of file +Застосунки іноді зберігають конфігурації як константи в коді. Це є порушенням методології дванадцяти факторів, +яка вимагає **обов'язкового відокремлення конфігурації від коду**. Конфігурації застосунку в розгортаннях суттєво +відрізняються, код — однаковий. + +Лакмусовим папірцем того, чи правильно розділені конфігурація і код, є можливість в будь-який момент відкрити +вихідний код застосунку у вільний доступ, при цьому не оприлюднюючи будь-яких приватних даних. + +Зверніть увагу, що визначення "конфігурації" **не містить** в собі внутрішні налаштування застосунку, +такі як `сonfig/routes.rb` в Rails, +або [як пов'язані основні модулі](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html) +в [Spring](http://spring.io/). Ці налаштування не змінюються між розгортаннями, і тому краще місце для них — саме в коді. + +Іншим підходом до конфігурації є використання конфігураційних файлів, що не зберігаються в систему контролю версій, +таких як `сonfig/database.yml` в Rails. Це перевага у порівнянні з використанням констант в коді, але все ж таки має +суттєві недоліки: є ймовірність помилково зберегти файл конфігурації в репозиторій; існує тенденція коли конфігураційні +файли розкидані в різних місцях і в різних форматах, і стає важко передивлятися всі налаштування і керувати ними в одному +місці. Крім того, формати цих файлів, як правило, специфічні для конкретної мови програмування чи фреймворку. + +**Застосунок дванадцяти факторів зберігає конфігурацію в *змінних оточення*** (часто скорочується до *env vars* або *env*). +Значення змінних оточення легко змінити між розгортаннями без зміни коду; на відміну від конфігураційних файлів, +менш ймовірно випадково зберегти їх в репозиторій коду; і на відміну від конфігураційних файлів або інших механізмів +конфігурації, таких як Java System Properties, вони є стандартом, незалежним від мови програмування чи фреймворку. + +Іншим аспектом керування конфігурацією є групування. Іноді застосунки об'єднують конфігурації в іменовані групи +(які часто називаються "оточеннями"), які називаються в залежності від конкретного розгортання, +наприклад, `development`, `test` і `production` оточення в Rails. Цей метод погано масштабується: чим більше створюється +різних розгортань застосунку, тим більше необхідно нових імен оточень, наприклад, `staging` або `qa`. +При подальшому рості проєкт розробники можуть додавати свої власні спеціальні оточення, наприклад, `joes-staging`, +що призводить до комбінаторного вибуху конфігурації, який робить керування розгортанням застосунку нестабільним. + +У застосунку дванадцяти факторів змінні оточення є незв'язаними між собою засобами керування. +Кожна змінна повністю незалежна від інших. Вони ніколи не групуються разом в "оточення", керування ними здійснюється +незалежно для кожного розгортання. Ця модель добре масштабується разом з появою більшої кількості розгортань застосунку +протягом його експлуатації. \ No newline at end of file diff --git a/content/uk/dependencies.md b/content/uk/dependencies.md index 64dde9f30..c89ac0b6a 100644 --- a/content/uk/dependencies.md +++ b/content/uk/dependencies.md @@ -1,12 +1,34 @@ ## II. Залежності ### Явно оголошуйте та ізолюйте залежності -Більшість мов програмування мають системи пакунків для розповсюдження бібліотек, такі як [CPAN](http://www.cpan.org/) для Perl або [Rubygems](http://rubygems.org/) для Ruby. Бібліотеки, встановлені через систему пакунків, можуть бути доступними для всієї системи (так звані "site-packages") або встановлені в каталог застосунку (так звані "vendoring" або "bundling"). +Більшість мов програмування мають системи пакунків для розповсюдження бібліотек, такі як [CPAN](http://www.cpan.org/) +для Perl або [Rubygems](http://rubygems.org/) для Ruby. Бібліотеки, встановлені через систему пакунків, +можуть бути доступними для всієї системи (так звані "site-packages") або встановлені в каталог застосунку +(так звані "vendoring" або "bundling"). -**Застосунок дванадцяти факторів ніколи не залежить від неявно існуючих, досупних всій системі пакунків.** Застосунок повно і точно вказує всі свої залежності за допомогою маніфесту *оголошення залежностей*. Крім того, він використовує інструмент *ізоляції залежністей* під час виконання, щоб гарантувати, що ніякі неявні залежності не "просочилися" з зовнішньої системи. Повна і явна специфікація залежностей використовується однаково як при розробці, так і в production. +**Застосунок дванадцяти факторів ніколи не залежить від пакунків доступних всій системі котрі існують неявно. +** Застосунок повно і точно вказує всі свої залежності за допомогою маніфесту *оголошення залежностей*. +Крім того, він використовує інструмент *ізоляції залежностей* під час виконання, щоб гарантувати, +що ніякі неявні залежності не "просочилися" з зовнішньої системи. Повна і явна специфікація залежностей використовується +однаково як при розробці, так і в production. -Наприклад, [Bundler](https://bundler.io/) в Ruby використовує `Gemfile` як формат маніфесту для оголошення залежностей і `bundle exec` для ізоляції залежностей. В Python є два окремі інструменти для цих задач - [Pip](http://www.pip-installer.org/en/latest/) використовується для оголошення і [Virtualenv](http://www.virtualenv.org/en/latest/) для ізоляції. Навіть C має [Autoconf](http://www.gnu.org/s/autoconf/) для оголошення залежностей, а статичне зв'язування може забезпечити ізоляцію залежностей. Який би не використовувався набір інструментів, оголошення і ізоляція залежностей завжди мають використовуватися разом — тільки одне або інше не є достатньою умовою для задоволення дванадцяти факторів. +Наприклад, [Bundler](https://bundler.io/) в Ruby використовує `Gemfile` як формат маніфесту для оголошення +залежностей і `bundle exec` для ізоляції залежностей. В Python є два окремі інструменти для цих задач +- [Pip](http://www.pip-installer.org/en/latest/) використовується для оголошення +- і [Virtualenv](http://www.virtualenv.org/en/latest/) для ізоляції. +- Навіть C має [Autoconf](http://www.gnu.org/s/autoconf/) для оголошення залежностей, а статичне зв'язування може +- забезпечити ізоляцію залежностей. Який би не використовувався набір інструментів, оголошення й ізоляція залежностей +- завжди мають використовуватися разом — тільки одне або інше не є достатньою умовою для задоволення дванадцяти факторів. -Однією з переваг явного оголошення залежностей є те, що це спрощує налаштування застосунку для нових розробників. Новий розробник може скопіювати кодову базу застосунку на свою машину, необхідними вимогами для якої є тільки наявність середовища виконання мови програмування та наявність менеджера залежностей. Все необхідне для запуску коду застосунку може бути налаштоване за допомогою визначеної *команди збірки*. Наприклад, команда збірки для Ruby/Bundler є `bundle install`, а для Clojure/[Leiningen](https://github.com/technomancy/leiningen#readme) це `lein deps`. +Однією з переваг явного оголошення залежностей є те, що це спрощує налаштування застосунку для нових розробників. +Новий розробник може скопіювати кодову базу застосунку на свою машину, необхідними вимогами для якої є тільки наявність +середовища виконання мови програмування та наявність менеджера залежностей. Все необхідне для запуску коду застосунку +може бути налаштоване за допомогою визначеної *команди збірки*. Наприклад, команда збірки для Ruby/Bundler +є `bundle install`, а для Clojure/[Leiningen](https://github.com/technomancy/leiningen#readme) це `lein deps`. -Застосунок дванадцяти факторів також ніколи не залежить від неявно існуючих будь-яких системних інструментів. Прикладом може бути запуск застосунком таких системних інструментів, як ImageMagick або `curl`. У той час, як ці інструменти можуть бути встановлені на багатьох або навіть більшості систем, немає жодної гарантії, що вони будуть встановлені на всіх системах, де застосунок може запускатися в майбутньому, або версія інструменту, встановлена в системі, буде сумісна з застосунком. Якщо застосунку потрібно запускати певні системні інструменти, то такі інструменти мають бути включені в сам застосунок. \ No newline at end of file +Застосунок дванадцяти факторів також ніколи не залежить від будь-яких системних інструментів котрі існують неявно. +Прикладом може бути запуск застосунком таких системних інструментів, як ImageMagick або `curl`. +У той час, як ці інструменти можуть бути встановлені на багатьох або навіть більшості систем, немає жодної гарантії, +що вони будуть встановлені на всіх системах, де застосунок може запускатися в майбутньому, або версія інструменту, +встановлена в системі, буде сумісна з застосунком. Якщо застосунку потрібно запускати певні системні інструменти, +то такі інструменти мають бути включені в сам застосунок. \ No newline at end of file diff --git a/content/uk/dev-prod-parity.md b/content/uk/dev-prod-parity.md index d31c57991..bb243c272 100644 --- a/content/uk/dev-prod-parity.md +++ b/content/uk/dev-prod-parity.md @@ -1,16 +1,21 @@ ## X. Dev/prod паритет ### Прагніть максимальної ідентичності development, staging та production середовищ -Історично склалося, що є суттєві відмінності між development середовищем (розробник вносить живі зміни в [локально розгорнутий](./codebase) застосунок) і production середовищем (до якого мають доступ кінцеві користувачі). Ці відмінності проявляються в трьох областях: +Історично склалося, що є суттєві відмінності між development середовищем +(розробник вносить живі зміни в [локально розгорнутий](./codebase) застосунок) і production середовищем +(до якого мають доступ кінцеві користувачі). Ці відмінності проявляються в трьох областях: * **Різниця в часі**: Розробник може працювати над кодом, який потрапить у production через дні, тижні або навіть місяці; * **Різниця в персоналі**: Розробники пишуть код, Ops-інженери розгортають його; -* **Різниця в інструментах**: Розробники можуть використовувати стек технологій такий, як Nginx, SQLite та OS X, в той час як на production використовується Apache, MySQL та Linux. +* **Різниця в інструментах**: Розробники можуть використовувати стек технологій такий, як Nginx, SQLite та OS X, +* в той час як на production використовується Apache, MySQL та Linux. -**Застосунок дванадцяти факторів проектується для [безперервного розгортання](http://avc.com/2011/02/continuous-deployment/), завдяки мінімізації різниці між production і development середовищами.** Розглянемо три відмінності, описані вище: +**Застосунок дванадцяти факторів проєктуватися для [безперервного розгортання](http://avc.com/2011/02/continuous-deployment/), +завдяки мінімізації різниці між production і development середовищами.** Розглянемо три відмінності, описані вище: * Зменшити різницю в часі: розробник може написати код і він буде розгорнутий через декілька годин або навіть хвилин; -* Зменшити різницю в персоналі: розробники, які писали код, беруть активну участь в його розгортанні і спостерігають за його поведінкою на production; +* Зменшити різницю в персоналі: розробники, які писали код, беруть активну участь в його розгортанні й спостерігають +за його поведінкою на production; * Зменшити різницю в інструментах: тримати development та production середовища максимально ідентичними. Резюмуючи сказане вище в таблицю: @@ -38,7 +43,9 @@ -[Сторонні служби](./backing-services), такі як бази даних, системи черг повідомлень або кеш, є однією з областей, де dev/prod паритет має важливе значення. Багато мов програмування мають бібліотеки, які спрощують доступ до сторонніх служб, в тому числі, *адаптери* для різних видів сервісів. Деякі приклади наведені в таблиці нижче. +[Сторонні служби](./backing-services), такі як бази даних, системи черг повідомлень або кеш, є однією з областей, +де dev/prod паритет має важливе значення. Багато мов програмування мають бібліотеки, які спрощують доступ до сторонніх +служб, в тому числі *адаптери* для різних видів сервісів. Деякі приклади наведені в таблиці нижче.