X.Geliştirme/Üretim Eşitliği
Gelişim, evreleme ve üretimi olabildikçe benzer tutma
Tarihsel olarak, geliştirme (bir geliştirici uygulamanın yerel dağıtımına canlı düzenlemeler yapar) ve ürün (uygulamanın çalışan dağıtımı son kullanıcılar tarafından erişilmiştir) arasında önemli aralıklar vardır. Bu aralıklar üç alanda belirtilir:
- Zaman aralığı: bir geliştirici kod üzerinde günler,haftalar hatta aylar boyunca bile ürünü oluşturmak için çalışabilir.
- Eleman aralığı: Geliştiriciler kod yazar, ops mühendisleri dağıtır.
- Araçların aralığı: Geliştiriciler ürün dağıtımı Apache, MySQL ve Linux kullanırken; Nginx, SQLite, ve OS X gibi yığınları kullanıyor olabilir.
On iki faktör uygulaması, geliştirme ve ürün aralığını küçük tutarak, sürekli dağıtım için tasarlanmıştır. Yukarda tanımlanan üç aralığa bakarsak:
- Zaman aralığını küçültme: bir geliştirici kod yazabilir ve bu kodu saatler veya hatta dakikalar sonra dağıtmış olabilir.
- Eleman aralığını küçültme: kodu yazan geliştiriciler, kodu dağıtmakla yakından ilişkilidir ve üründeki davranışını izler.
- Araçların aralığını küçültme: geliştirmeyi ve ürünü olabildiği kadar benzer tut.
Üstekileri bir tablo olarak özetlersek:
Geleneksel uygulama | On iki faktör uygulaması | |
---|---|---|
Dağıtımlar arasındaki zaman | Haftalar | Saatler |
Kod yazarları ve kod dağıtımcıları | Farklı insanlar | Aynı insanlar |
Geliştirme ve ürün ortamı | Farklı | Olabildiğince benzer |
Destek servisler; uygulamanın veritabanı, kuyruk sistemi veya önbellek gibi, geliştirme/üretim eşitliğinin önemli olduğu bir alandır. Bir çok dil, farklı tipteki servislerin uyarlayıcılarını içeren, destek servislerine ulaşımı kolaylaştıran kütüphanleri önerir. Bazı örnekler aşağıdaki tabloda vardır.
Tip | Dil | Kütüphane | Uyarlayıcı |
---|---|---|---|
Veritabanı | Ruby/Rails | ActiveRecord | MySQL, PostgreSQL, SQLite |
Kuyruk | Python/Django | Celery | RabbitMQ, Beanstalkd, Redis |
Önbellek | Ruby/Rails | ActiveSupport::Cache | Bellek, dosya sistemi, Memcached |
Geliştiriciler, üründe ciddi ve sağlam destek servisleri kullanırken, bazen kendi yerel ortamlarında önemsiz destek servislerini kullanmak için istek duyarlar. Örneğin, yerelde SQLite üründe PostgreSQL kullanılır veya geliştirmede depolama için yerel süreç belleği ve üründe de Memcached kullanılır.
On iki faktör geliştiricisi, uyarlayıcılar teorik olarak destek servislerindeki herhangi bir farklılığı soyutladığı zaman bile geliştirme ve ürün arasında faklı destek servisi kullanma isteğine karşı direnir. Destek hizmetleri arasındaki farklılıklar, küçük uyumsuzlukların ortaya çıkması, kodun işe yaraması ve geliştirme aşamasında testlere geçilmesi veya üretimde başarısız olmaya neden olması anlamına gelir. Bu tür hatalar, sürekli dağıtımın etkisini azaltan bir sürtüşme yaratır. Bu sürtünme maliyeti ve sonraki devamlı dağıtımın azaltılması, bir uygulamanın ömrü süresince toplamda düşünüldüğünde oldukça yüksektir.
Önemsiz yerel servisler bir zamanlar olduğundan daha zorlayıcıdır. Memcached, PostgreSQL ve RabbitMQ gibi modern destek servisleri, Homebrew ve apt-get gibi modern paket sistemleri sayesinde yüklemesi ve çalıştırılması zor değildir. Alternatif olarak, Chef ve Puppet gibi bildiri sağlayıcı araçlar önemsiz sanal ortamlarla birleşir, Vagrant gibi, geliştiricilerin yerel ortamda çalışmalarına izin verir, yaklaşık olarak ürün ortamına benzer. Bu sistemlerin yüklenmesi ve kullanımının maliyeti, geliştirme üretim eşitliği ve sürekli dağıtımın faydasıyla karşılaştırıldığında düşüktür.
Farklı destek servislerinin uyarlayıcıları hala kullanışlıdır, çünkü yeni destek servislerine bağlanmayı nispeten zahmetsiz yapar. Ama uygulamanın bütün dağıtımları (geliştirme ortamları, evreleme, ürün) her bir destek servisinin aynı tip ve versiyonunu kullanmalıdır.