Preskoči na sadržaj

X. Paritet razvoja/produkcije

Info

Sadržaj u nastavku je prijevod stranice X. Dev/prod parity na web sjedištu The Twelve-Factor App.

X. Paritet razvoja/produkcije

Održavajte razvoj, uprizorenje i produkciju što sličnijim

Povijesno gledano, postojale su značajne praznine između razvoja (razvijatelj koji uživo uređuje lokalnu implementaciju aplikacije) i produkcije (pokrenuta implementacija aplikacije kojoj pristupaju krajnji korisnici). Te se praznine manifestiraju u tri područja:

  • Vremenski jaz: razvijatelj može raditi na kôdu za koji su potrebni dani, tjedni ili čak mjeseci da krene u implementaciju.
  • Jaz među osobljem: razvijatelji pišu kôd, operativni inženjeri ga implementiraju.
  • Jaz među alatima: razvijatelji možda koriste stog poput Nginxa, SQLitea i OS X-a, dok produkcijska implementacija koristi Apache, MySQL i Linux.

Dvanaestofaktorska aplikacija dizajnirana je za kontinuiranu implementaciju tako da je jaz između razvoja i produkcije malen. Gledajući tri opisane praznine iznad:

  • Učinite vremenski razmak malenim: razvijatelj može napisati kôd i imati ga implementiranog satima ili čak samo nekoliko minuta kasnije.
  • Učinite jaz među osobljem malenim: razvijatelji koji su napisali kôd usko su uključeni u njegovu implementaciju i promatranje njegovog ponašanja u produkciji.
  • Učinite jaz među alatima malenim: održavajte razvoj i produkciju što sličnijima.

Sumirajući gore navedeno u tablicu:

Tradicionalna aplikacija Dvanaestofaktorska aplikacija
Vrijeme između postavljanja Tjedni Sati
Autori kôda i implementatori kôda Različiti ljudi Isti ljudi
Razvojna i produkcijska okruženja Divergentna Što je moguće sličnija

Potporne usluge, kao što su baza podataka aplikacije, sustav za upravljanje redovima čekanja ili predmemorija, jedno je područje u kojem je važan paritet razvoja/produkcije. Mnogi jezici nude knjižnice koje pojednostavljuju pristup potpornoj usluzi, uključujući adaptere za različite vrste usluga. Neki primjeri su u donjoj tablici.

Vrsta Jezik Knjižnica Adapteri
Baza podataka Ruby/Rails ActiveRecord MySQL, PostgreSQL, SQLite
Red čekanja Python/Django Celery RabbitMQ, Beanstalkd, Redis
Predmemorija Ruby/Rails ActiveSupport::Cache Memorija, datotečni sustav, Memcached

razvijatelji ponekad pronalaze veliku privlačnost u korištenju lagane pozadinske usluge u svojim lokalnim okruženjima, dok će se ozbiljnija i robusnija pomoćna usluga koristiti u produkciji. Na primjer, korištenje SQLitea lokalno i PostgreSQL-a u produkciji; ili lokalnu procesnu memoriju za predmemoriju u razvoju i Memcached u produkciji.

Dvanaestofaktorski razvijatelj odolijeva porivu za korištenjem različitih potpornih usluga između razvoja i produkcije, čak i kada adapteri teoretski apstrahiraju sve razlike u potpornim uslugama. Razlike između potpornih usluga znače da se pojavljuju male nekompatibilnosti, što uzrokuje neuspjeh u produkciji kôda koji je radio i prošao testove u razvoju ili uprizorenju. Ove vrste pogrešaka stvaraju trenje koje destimulira kontinuiranu implementaciju. Trošak ovog trenja i naknadnog prigušenja kontinuirane implementacije iznimno je visok kada se promatra u zbroju tijekom životnog vijeka aplikacije.

Lagane lokalne usluge manje su uvjerljive nego što su nekada bile. Moderne potporne usluge kao što su Memcached, PostgreSQL i RabbitMQ nije teško instalirati i pokrenuti zahvaljujući modernim sustavima pakiranja, kao što su Homebrew i apt-get. Alternativno, deklarativni alati za osiguravanje resursa kao što su Chef i Puppet u kombinaciji s laganim virtualnim okruženjima kao što su Docker i Vagrant omogućuju razvijateljima pokretanje lokalnih okruženja koja su usko približna produkcijskim okruženjima. Troškovi instaliranja i korištenja ovih sustava su niski u usporedbi s prednostima pariteta razvoja/produkcije i kontinuirane implementacije.

Adapteri za različite potporne usluge i dalje su korisni jer čine prijenos na nove potporne usluge relativno bezbolnim. No, sve implementacije aplikacije (okruženja razvijatelja, uprizorenje, produkcija) trebaju koristiti istu vrstu i verziju svake od potpornih usluga.

Author: Adam Wiggins