12 Factor App (Twelve-Factor App) Metodolojisi
12 Factor App, Heroku platformu geliştiricisi Adam Wiggins tarafından geliştirilmiş bir metodolojidir. 12 Factor App prensipleri, Heroku'nun deneyimlerine dayanarak oluşturulmuş ve uygulamaların bulut tabanlı ortamlarda daha iyi performans göstermesini sağlamak amacıyla ortaya çıkmıştır.
12 Factor App, Heroku'nun uygulama geliştirme ve dağıtım süreçlerinde elde ettiği başarılardan yola çıkarak oluşturulmuş ve zamanla yaygın bir kabul görmüştür. Bu prensipler, uygulamaların taşınabilirliği, ölçeklenebilirliği, sürdürülebilirliği ve yönetilebilirliği gibi önemli faktörleri optimize etmek için geliştiricilere bir yol gösterici sunmaktadır. 12 Factor App, yazılım geliştirme topluluğunda geniş bir kabul görmüş ve modern uygulama geliştirme süreçlerinde yaygın olarak kullanılan bir referans haline gelmiştir.
1. Codebase (Kod Tabanı)
“One codebase tracked in revision control, many deploys”

Codebase (Kod Tabanı): Tek bir kod tabanı, uygulamanın farklı ortamlarda çalışmasını sağlar. Farklı ortamlar için yapılandırma ayarlarını içeren dış kaynaklardan bağımsız olmalıdır. Örnek: Bir e-ticaret uygulaması için, tüm kaynak kodlarını içeren bir Git reposu kullanılabilir.
2. Dependencies (Bağımlılıklar)
“Explicitly declare and isolate dependencies”

Dependencies (Bağımlılıklar): Uygulamanın bağımlı olduğu tüm bileşenlerin, bağımlılık yöneticisi gibi bir araçla açıkça belirtilmesi gerekmektedir. Örnek: Bir Node.js projesinde package.json dosyası, uygulamanın bağımlı olduğu paketleri ve sürümlerini belirtir.
3. Config (Yapılandırma)
“Store config in the environment”

Config (Yapılandırma): Yapılandırma ayarları, uygulamanın dışarıdan ayarlanabilir olmalıdır. Yapılandırma ayarları kod içine gömülmemeli ve çevresel değişkenler veya yapılandırma dosyaları gibi dış kaynaklardan okunmalıdır. Örnek: Bir web uygulamasında, veritabanı bağlantı bilgileri gibi yapılandırma ayarları, bir yapılandırma dosyasında veya ortam değişkenlerinde saklanabilir.
4. Backing Services (Destekleyici Hizmetler)
“Treat backing services as attached resources”

Backing Services (Destekleyici Hizmetler): Uygulama, veritabanları, mesaj kuyrukları veya çevrimiçi hizmetler gibi dış hizmetlere bağımlı olabilir. Bu hizmetlere erişim, dışarıdan sağlanmalıdır. Örnek: Bir e-posta gönderme işlevi, bir dış e-posta hizmetine (örneğin, SendGrid veya Mailgun) bağımlı olabilir.
5. Build, Release, Run (Derleme, Yayınlama, Çalıştırma)
“Strictly separate build and run stages”

Build, Release, Run (Derleme, Yayınlama, Çalıştırma): Derleme süreci, uygulamanın kaynak kodlarını bir yürütülebilir duruma dönüştürür. Yayınlama süreci, derlenmiş uygulamanın belirli bir ortamda çalışmasını sağlar. Çalıştırma süreci ise uygulamanın çalıştırılmasını yönetir. Örnek: Bir CI/CD (Continuous Integration/Continuous Deployment) aracı, kaynak kodunu derler, test eder ve bir sunucuya yayınlar.
6. Processes (İşlemler)
“Execute the app as one or more stateless processes”

Processes (İşlemler): Uygulama, tek bir süreç içinde çalışmaktansa, bağımsız ve birbirleriyle iletişim kuran çok sayıda işlem parçasına (process) bölünmelidir. Örnek: Bir web sunucusu, gelen istekleri işlemek için birden fazla işlem parçası kullanabilir.
7. Port Binding (Bağlama)
“Export services via port binding”

Port Binding (Bağlama): Uygulama, içerisinde çalıştığı sunucuya dinamik olarak bağlanmalıdır. İstemciye veya sunucuya sabit bir IP veya port atamamalıdır. Örnek: Bir web sunucusu, belirli bir port üzerinden gelen isteklere dinamik olarak yanıt vermelidir.
8. Concurrency (Eş Zamanlılık)
“Scale out via the process model”

Concurrency (Eş Zamanlılık): Uygulama, dikey veya yatay ölçeklenebilirlik için paralel olarak çalışabilme yeteneğine sahip olmalıdır. Örnek: Bir mesaj kuyruğu, aynı anda birden fazla işlemi eşzamanlı olarak işleyebilmelidir.
9. Disposability (Atılabilirlik)
“Maximize robustness with fast startup and graceful shutdown”
Disposability (Atılabilirlik): Uygulama, dinamik olarak başlayıp durdurulabilir olmalı ve hızlı bir şekilde ölçeklendirilebilir olmalıdır. Bir işlem sona erdiğinde kaynakları serbest bırakmalıdır. Örnek: Bir mikro servis, yüksek talep anlarında otomatik olarak ölçeklendirilebilir ve gereksiz olduğunda hızlıca sonlandırılabilir.
10. Dev/Prod Parity (Geliştirme/Üretim Eşitliği)
“Keep development, staging, and production as similar as possible”

Dev/Prod Parity (Geliştirme/Üretim Eşitliği): Geliştirme, test ve üretim ortamları arasında mümkün olduğunca benzerlik sağlanmalıdır. Bu, hataların ortaya çıkmasını azaltır. Örnek: Geliştirme ortamında kullanılan veritabanı sürümü, üretim ortamında da kullanılmalıdır.
11. Logs (Kayıtlar)
“Treat logs as event streams”

Logs (Kayıtlar): Uygulama, çalışma zamanında oluşan logları etkin bir şekilde yakalamalı ve yönetmelidir. Bu loglar, uygulamanın durumunu ve hatalarını izlemek için kullanılabilir. Örnek: Bir web sunucusu, gelen istekler ve hata mesajları gibi logları bir merkezi log yönetim sistemine gönderebilir.
12. Admin Processes (Yönetici İşlemleri)
“Run admin/management tasks as one-off processes”

Admin Processes (Yönetici İşlemleri): Yönetici görevlerinin, uygulama içinde bir komut satırı arayüzü aracılığıyla gerçekleştirilebilmesi sağlanmalıdır. Bu işlemler, uygulamanın yapılandırmasını değiştirebilir veya teşhis amacıyla kullanılabilir. Örnek: Bir e-ticaret uygulamasında, veritabanı tablolarını oluşturmak veya yönetici hesapları oluşturmak gibi yönetici işlemleri gerçekleştirebilirsiniz.

Sonuç
Sonuç olarak, bu prensipler, uygulamaların bulut tabanlı ortamlarda daha iyi performans göstermesini sağlamak amacıyla geliştirilmiştir. Uygulamaların taşınabilirliği, ölçeklenebilirliği, sürdürülebilirliği ve yönetilebilirliği gibi önemli faktörleri optimize etmek için geliştiricilere bir yol gösterici sunar. 12 Factor App prensipleri, modern yazılım geliştirme süreçlerinde geniş bir kabul görmüş ve başarılı uygulamaların geliştirilmesinde yaygın olarak kullanılan bir referans haline gelmiştir.
Bu prensipler, kod tabanının etkin bir şekilde yönetilmesini, bağımlılıkların açıkça belirtilmesini, yapılandırmanın dış kaynaklarda saklanmasını, destekleyici hizmetlere bağımlılığın doğru şekilde yönetilmesini, derleme, yayınlama ve çalıştırma süreçlerinin ayrıştırılmasını, işlemlerin bağımsız olarak çalışmasını, bağlama ve eş zamanlılık konularının göz önünde bulundurulmasını, atılabilirlik ve ölçeklenebilirlik unsurlarının dikkate alınmasını, geliştirme ve üretim ortamları arasında benzerlik sağlanmasını, log yönetiminin etkin bir şekilde yapılmasını ve yönetici işlemlerinin kolaylıkla gerçekleştirilebilmesini vurgular.
Bu prensiplere uygun bir şekilde tasarlanan uygulamalar, daha esnek, taşınabilir, ölçeklenebilir, sürdürülebilir ve güvenilir olma özelliklerini kazanır. 12 Factor App, modern yazılım geliştirme süreçlerindeki başarıyı artırırken, ekip çalışmalarını kolaylaştırır ve hızlı ve etkili bir şekilde uygulama dağıtımını ve yönetimini sağlar. Dolayısıyla, bu prensipleri dikkate alarak geliştirilen uygulamalar, hem geliştiriciler hem de kullanıcılar için önemli avantajlar sunar.
Umarım bu yazı sizler için faydalı olmuştur. Diğer tüm yazılarıma göz atmayı unutmayın. Şimdilik hoşça kalın!
Referanslar

Software Engineer
A passionate software engineer who enjoys creating elegant solutions to complex problems. Beyond coding, I am deeply interested in exploring the intersections of technology, art, and human consciousness.