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.