X. Dev/prod parity

Vývojové, testovacie a produkčné prostredie sú čo najpodobnejšie ako sa dá

Historicky bývali podstatné rozdiely medzi vývojovým prostredím (developer upravoval živé lokálne nasadenie) a produkčným prostredím (bežiace nasadenie aplikácie, na ktoré pristupujú používatelia). Tieto rozdiely sa prejavujú v týchto troch oblastiach:

Dvanásť faktorová aplikácia je navrhnutá pre continuous deployment tak, že udržiava rozdiely medzi vývojom a produkciou. Keď sa pozrieme na tri rozdiely popísané vyššie:

Súhrn vyššie napísaného v tabuľke:

Tradičná aplikácia Dvanásť faktorová aplikácia
Čas medzi nasadeniami Týždne Hodiny
Autori kódu vs nasadzovači kódu Rôzni ľudia Rovnakí ľudia
Vývojárske vs produkčné prostredie Rozdielne Čo najpodobnejšie

Podporné služby ako napríklad databáza, fronty alebo cache sú oblasťou, kde je zhodnosť vývojárskeho-produkčného prostredia dôležitá. Veľa jazykov poskytuje knižnice, ktoré uľahčujú prístup k podporným službám, vrátane adaptérov k rôznym typom služieb. Niektoré príklady sú v tabuľke nižšie.

Typ Jazyk Knižnica Adapér
Databáza Ruby/Rails ActiveRecord MySQL, PostgreSQL, SQLite
Fronta Python/Django Celery RabbitMQ, Beanstalkd, Redis
Cache Ruby/Rails ActiveSupport::Cache Pamäť, súborový systém, Memcached

Developeri niekedy radi používajú odľahčené podporné služby na lokálny vývoj, pričom na produkcii sú robustnejšie podporné služby. Napríklad používajú SQLite lokálne a PostgreSQL na produkcii; alebo pamäť lokálneho procesu počas vývoja a Memcached na produkcii.

Dvanásť faktorový vývojár odoláva nutkaniu používať rôzne podporné služby medzi vývojom a produkciou, aj v prípade, že adaptéry teoreticky abstrahujú rozdiely medzi službami. Rozdiely medzi službami znamenajú, že sa vyskytnú maličné nekompatibility a spôsobia, že kód prejde cez testy pri vývoji alebo testovaní a zlyhá na produkcii. Tieto typy chýb vytvárajú trenie, ktoré spomaľuje priebežné nasadzovanie. Cena tohoto trenia a následné spomalenie priebežného nasadzovania je extrémne vysoká, keď ju sčítame cez celú životnosť aplikácie.

Odľahčené lokálne služby už nie sú také príťažlivé ako boli. Moderné podporné služby ako Memcached, PostgreSQL a RabbitMQ nie je ťažké nainštalovať a spustiť vďaka moderným balíčkovacím systémom ako Homebrew a apt-get. Alternatívne deklaratívne nástroje ako Chef a Puppet skombinované s odľahčenými virtuálnymi prostrediami ako Docker a Vagrant umôžňujú vývojárom vytvoriť lokálne prostredie, ktoré tesne aproximuje produkčné prostredie. Cena inštalácie a používania týchto systémov je nízka v porovnaní s výhodami rovnakého prostredia vývoj/produkcia.

Adaptéry k rôznym podporným službám sú stále užitočné, pretože umožňujú plynulú migráciu na nové podporné služby. Ale všetky nasadenia aplikácia (vývojárske prostredie, testovacie, produkcia) by mali používať rovnaký typ a verziu každej podpornej služby.