12 Factor App (Uygulama Geliştirme Prensipleri)

12 Factor App Heroku cloud platformunun, 2012 yılında bir manifesto yayınlamasıyla teknoloji dünyasında yer bulmuştur. Saas tabanlı cloud native uygulama geliştirmek için dikkat edilmesi gereken konulardan bahsetmektedir. Üst seviyede 5 tane hedefi vardır.

  • Projeye yeni bir developer katıldığında kurulum, zaman, öğrenme v.s. maliyetleri minimize etmek. Bunu yapabilmek için kurulumların otomatize edilmesi gerekir. Uygulama kodları (github, svn, tfs v.s.) platformlar üzerinde geliştirici tarafından erişilebilir olmalı.
  • Uygulama çalışacağı ortamda ihtiyacı olan bağımlılıkların neler olduğunu contract aracılığı ile belirtmelidir.
  • Büyüyen uygulamlar hem maliyet hemde performans açısından cloud üzerinde host edilmeli.
  • Değişen teknolojiler aynı zamanda müşterilerin beklentilerini de etkilemiştir. Agile yaklaşımı ile sık sık deployment yaparak müşteriye ürünün her aşaması gösterilmelidir. Bunun daha rahat yapılabilmesi için DEV, QA ve PROD ortamları arasındaki geçiş otomatize edilmelidir.
  • Uygulama üzerine gelen yükler (request) ölçeklenir olmalı ve aynı zamanda bu yükler birden fazla instance’a dağıtılmalıdır.

12 Factor app uygulama bağımsız bir yaklaşımdır. Hangi platformda hangi dilde uygulama geliştirdiğinizin önemi yoktur. Bu yaklaşım tümünde uygulanabilir.

1-Codebase

Uygulamamızın kaynak kodlarını github, svn, tfs gibi kaynak kontrol sistemleri üzerinde tutmamız gerekir.

Aynı zamanda tek bir repository içinde bulundurmak yönetimi kolaylaştırır. Bir uygulama bir repo’da yer almalıdır. Bir repoda birden fazla uygulama tutmak karışıklığa sebep olmaktadır. Deployment’lar tek bir codebase üzerinden yapılmalıdır.

2-Dependencies (Bağımlılıklar)

Uygulama ihtiyaç duyduğu bağımlılıları kendi üzerinde tutmalıdır. İhtiyaç duyacağı dizinlerin tanımlı olması gerekir. Bağımlılıkların versiyonları mutlaka belirtilmelidir.

3-Config

Uygulama ayarları ve platform bazlı değişkenler merkezi config üzerinde tutulmalıdır. Örnek verecek olursak uygulama birden fazla yerde kurulu olduğunu varsayalım. Tek bir configin değişmesi gerektiği durumlarda tüm platformlarda bunu değiştirmek yerine. Merkezi noktadan değiştirilerek tüm ortamlardan değişmesi sağlanmalıdır.

4-Backing Services

Uygulamanızın çalışması için gerekli olan,dışardan tüketiği tüm servis ve bilgiler configte tutulmaldır. Tek bir backing service tek bir url ile erişilebilmeli. Uygulamaya reset atmadan tüketilen bu servislerin yerine altarnatifi kolayca eklenebilmeli.

5- Build, Release and Run

Build aşamasında kompleks işlemler yapılabilir. (Test, statik analiz v.s.) Tek bir codebase üzerinden alınan build farklı bir tarihte aynı çıktıyı vermesi gerekir. Geçen süre sonunda fonksiyon aynı versiyonda farklı davranışlar sergilememelidir. Build’ler merkezi bir noktadan elde edilmelidir.

6-Processes (Süreçler)

Uygulama üzerinde state tutmayan yapılar kurun. Bunun yerine veritabanı kullanın. Bellekte tutulan session’lar yerine merkezi cache mekanizmaları kullanın. Böylece uygulama farklı instance’lar üzerinde daha doğru ve stabil çalışacaktır.

7-Port Binding

Bir uygulama (servis) tek port üzerinden sunulmalıdır. Devops tarafında da servisler çeşitli instance’lar üzerinde ayağa kalktığında portlarını servis discovery’e bildirir ve gelen requestler buna göre dağıtılır.

8-Concurrency (Eşzamanlılık)

Uygulamaya gelen yükü (request) karşılayabilmek için iki farklı ölçekleme yöntemi kullanılır. Birincisi vertical (dikey) yöntemdir bu yöntemde makine kapasitesi artırımı yapılır. Diğeri ise horizontal (yatay) ölçeklemedir. Bunda ise uygulama farklı instance’lar üzerinde host edilerek gelen istekler karşılanır. Uygulamamız ihtiyaçlara göre eş zamanlı şekilde klonlarabilmeli ve restart edilebilmelidir. (Yatay ölçekleme bunu gerektirir.)

9-Disposibility

Uygulama hızlı bir şekilde ayağa kalkabilmeli aynı şekilde hızlı şekilde kapanabilmeli.

Örnek verecek olursak bilet satışı yapan bir sitemiz olsun. Belli saatler aralığında gelen request sayısı artmasından ötürü hızlıca uygulama, farklı instance’lar üzerinde rahatça ayağa kalkabilmeli ve sayısı artabilmeli. Bu sayede uygulamaya gelen request kaybının önüne geçmiş olunur.

10-Dev/Prod Paritiy

Dev ve prod ortamları arasındaki mesafe kısaltılmalıdır. Yapılan ek bir geliştirmenin prod ortamına aktarılma süresini kapsamaktadır. Geliştirmeyi yapan ekip ile deploymentı yapan ekipler farklı ise bu süre uzayabilmektedir. İşte bu nedenle devops kavramı ortaya çıkmıştır. Devops kültüründe kodu geliştiren ile deploy eden ekip genelde aynıdır. Ayrıca bu yaklaşım geliştirme ortamının dev ortamla bire bir aynı olmasını bekler.

11-Logs

Uygulama içinde loglama yapılken time’lar tutulmalıdır. Ayrıca loglar standart bir yere basılmaldır. Burada en çok kullanılan ürünler Elastic Search, logstash, kibana tool’larıdır. Loglar belli yapıda kolay anlaşılır olmalıdır. Log mekanizmaları async olarak kullanılmalıdır.

12-Admin Processes

Uygulama üzerinde tek seferlik çalıştırılacak scriptler tek elden yönetilmelidir. Örnek olarak db migration, sql scriptleri v.s.

--

--