The Twelve-Factor App

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:

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:

Ü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.