Kihagyás

10. Fejlesztői/prod egyezés

Tartsd a fejlesztést, tesztelést és a termelést lehetőleg hasonlóvá

A történelemben lényeges különbségek voltak a fejlesztés (amikor a fejlesztő élő szerkesztéseket végez az alkalmazás helyi verzióján) és a termelés (amikor a felhasználók által elérhető, futó alkalmazás) között. Ezek a különbségek három területen mutatkoznak meg:

  • Időbeli különbség: Egy fejlesztő olyan kódon dolgozhat, amely napokig, hetekig vagy akár hónapokig tart, mire a termelésbe kerül.
  • Személyi különbség: A fejlesztők írják a kódot, az üzemeltető mérnökök telepítik.
  • Eszközkülönbség: A fejlesztők olyan technológiákat használhatnak, mint a Nginx, SQLite és az OS X, míg a termelésben Apache, MySQL és Linux fut.

A tizenkét tényezős alkalmazás a folyamatos telepítésre van tervezve a fejlesztés és a termelés közötti különbségek minimalizálásával. Az előbb említett három különbség tekintetében:

  • Csökkentsd a időbeli különbséget: egy fejlesztő olyan kódot írhat, amelyet órákkal vagy akár csak percekkel később telepítenek.
  • Csökkentsd a személyi különbséget: a kódot író fejlesztők aktívan részt vesznek a telepítésben és figyelemmel kísérik annak viselkedését a termelésben.
  • Csökkentsd az eszközkülönbséget: tartsd a fejlesztést és a termelést lehetőleg hasonlóképpen.

Az előbbiek összefoglalása egy táblázatban:

Hagyományos alkalmazás Tizenkét tényezős alkalmazás
Telepítések közötti idő Hetek Órák
Kód szerzői és telepítői Különböző emberek Ugyanazok az emberek
Fejlesztői és termelési környezetek Eltérőek Lehetőleg hasonlók

A háttértámogatási szolgáltatások, mint például az alkalmazás adatbázisa, sorkezelő rendszere vagy gyorsítótára, egy olyan terület, ahol fontos a fejlesztői/produkciós egyezés. Sok nyelv kínál olyan könyvtárakat, amelyek egyszerűsítik a hátter szolgáltatáshoz való hozzáférést, beleértve a különböző típusú szolgáltatások adaptereit is. Néhány példa található a táblázatban.

Típus Nyelv Könyvtár Adapterek
Adatbázis Ruby/Rails ActiveRecord MySQL, PostgreSQL, SQLite
Sorkezelő Python/Django Celery RabbitMQ, Beanstalkd, Redis
Gyorsítótár Ruby/Rails ActiveSupport::Cache Memória, fájlrendszer, Memcached

A fejlesztők gyakran vonzódnak a könnyűsúlyú háttértároló használatához a helyi környezetben, míg a termelésben komolyabb és megbízhatóbb háttértárolót használnak. Például, SQLite használata helyileg és PostgreSQL a termelésben; vagy helyi folyamatmemória használata a gyorsítótárban fejlesztés során, és Memcached a termelésben.

A tizenkét tényezős fejlesztő ellenáll annak a kísértésnek, hogy eltérő háttértárolókat használjon a fejlesztés és a termelés között, még akkor is, ha az adapterek elvileg elrejtik a háttértárolók közötti különbségeket. A háttértárolók közötti különbségek azt jelentik, hogy apró összeférhetetlenségek merülnek fel, ami azt eredményezi, hogy a fejlesztési vagy tesztelési környezetben működő és teszteket átmenő kód hibát okozhat a termelésben. Ezek a hibatípusok súrlódást okoznak, ami nem ösztönzi a folyamatos telepítést. Ennek a súrlódásnak és a folyamatos telepítés további gátlásának költsége rendkívül magas, ha az alkalmazás élettartamára vetítve megvizsgáljuk.

A könnyűsúlyú helyi szolgáltatások kevésbé vonzóak, mint korábban. A Memcached, a PostgreSQL és a RabbitMQ modern háttértároló szolgáltatások könnyen telepíthetőek és futtathatóak a modern csomagrendszerek, mint például a Homebrew és az apt-get segítségével. Ezenkívül, a deklaratív elrendezési eszközök, mint a Chef és a Puppet, a könnyűsúlyú virtuális környezetekkel, mint a Docker és a Vagrant, kombinálva lehetővé teszik a fejlesztők számára, hogy olyan helyi környezeteket futtassanak, amelyek közel azonosak a termelési környezettel. Ezeknek a rendszereknek a telepítési és használati költsége alacsony a fejlesztés/termelés összhangjának és a folyamatos telepítés előnyéhez képest.

Az adapterek különböző háttértároló szolgáltatásokhoz továbbra is hasznosak, mert könnyűvé teszik a váltást új háttértároló szolgáltatásokra. Azonban az alkalmazás minden telepítése (fejlesztői környezetek, tesztelés, termelés) ugyanazt a típusú és verziójú háttértároló szolgáltatást kell használnia.