X.Geliştirme/Üretim Eşitliği

Geliştirme, test etme ve canlı yayın ortamının birbirine olabildiğince benzer olması

Tarihsel olarak, geliştirme ortamı (geliştiricinin uygulamanın yerel dağıtımına anlık düzenlemeler yaptığı) ve canlı yayın (uygulamanın son kullanıcılar tarafından erişilen çalışan dağıtımı) arasında önemli aralıklar olurdu. Bu aralıklar üç alanda belirtilir:

On iki faktör uygulaması, geliştirme ve canlı yayın aralığını küçük tutarak, sürekli dağıtım için tasarlanmıştır. Yukarda tanımlanan üç aralığa bakarsak:

Ü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 canlı yayın ortamı Farklı Olabildiğince benzer

Uygulamanın veritabanı, kuyruk sistemi veya önbellek gibi yardımcı servisleri, geliştirme/canlı yayın eşitliğinin önemli olduğu bir alandır. Birçok dil, farklı tipteki servislerin uyarlayıcılarını (adaptörlerini) içeren, yardımcı servislere ulaşımı kolaylaştıran kütüphaneler ö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, canlı yayında daha ciddi ve sağlam yardımcı servisleri kullanırken, bazen kendi yerel ortamlarında hafif yardımcı servisleri kullanmak isterler. Örneğin, yerelde SQLite, canlı yayında ise PostgreSQL kullanılır, veya yerelde geçici depolama (İng. cache) için süreç belleği, canlı yayında ise Memcached kullanılır.

On iki faktör geliştiricisi, uyarlayıcılar teorik olarak yardımcı servislerdeki herhangi bir farklılığı soyutluyor olsa bile, geliştirme ve canlı yayın arasında faklı yardımcı servisi kullanma isteğine karşı direnir. Yardımcı servisler arasındaki farklılıklar, küçük uyumsuzlukların ortaya çıkmasına, yerelde çalışan ve testleri geçen kodun, canlı yayında başarısız olmaya neden olmasına sebep olabilir. Bu tür hatalar, sürekli dağıtıma köstek olan bir sürtünme yaratır. Bu sürtünme maliyeti ve sonraki devamlı dağıtımın azaltılması, bir uygulamanın ömrünün toplamı düşünüldüğünde oldukça yüksektir.

Hafif yerel servisler eskiye göre daha az çekicidir. Memcached, PostgreSQL ve RabbitMQ gibi modern yardımcı servisleri, Homebrew ve apt-get gibi modern paket sistemleri sayesinde kolayca yüklenebilir ve çalıştırılabilir. Alternatif olarak, Chef ve Puppet gibi ortam hazırlayıcı araçlar, ve Vagrant ve Docker gibi hafif sanal ortam sağlayıcıları, geliştiricilerin canlı yayın ortamına çok benzeyen yerel ortamda çalışabilmelerini sağlar. Bu sistemlerin yüklenmesi ve kullanımının maliyeti, geliştirme ve canlı yayın eşitliği ve sürekli dağıtımın faydasıyla karşılaştırıldığında oldukça düşüktür.

Farklı yardımcı servislerin uyarlayıcıları hala kullanışlıdır, çünkü yeni yardımcı servislere bağlanmayı nispeten zahmetsiz yapar. Ama uygulamanın bütün dağıtımları (geliştirme, test, canlı yayın ortamları) her bir yardımcı servisinin aynı tip ve versiyonunu kullanmalıdır.