Dil Seçin

Mikroservis Mimarisi: Kavramlar, Güdüler ve Uygulama Kalıpları

IEEE Software podcast transkriptine dayanan mikroservis mimarisi analizi; tanımlar, motivasyonlar, benimseme kalıpları ve pratik hususları kapsar.
apismarket.org | PDF Size: 0.3 MB
Değerlendirme: 4.5/5
Değerlendirmeniz
Bu belgeyi zaten değerlendirdiniz
PDF Belge Kapağı - Mikroservis Mimarisi: Kavramlar, Güdüler ve Uygulama Kalıpları

1. Giriş & Genel Bakış

Bu içerik, Software Engineering Radio podcast'inin (bölüm 213) bir bölümünden türetilmiştir ve Johannes Thönes ile James Lewis'in mikroservisler konusundaki tartışmasını içermektedir. Konuşma, büyük, monolitik uygulamaların bakım zorluklarına bir yanıt olarak 2015'in başlarında önemli bir ivme kazanan bu mimari tarzın tanımını, motivasyonlarını ve pratik hususlarını araştırmaktadır.

2. Mikroservisleri Tanımlamak

Bir mikroservis, küçük, odaklanmış bir uygulama bileşeni olarak kavramsallaştırılır.

2.1 Temel Özellikler

Tartışmaya göre, bir mikroservis birkaç temel özelliğe sahiptir:

  • Bağımsız Dağıtım: Diğer servislerde değişiklik gerektirmeden dağıtılabilir.
  • Bağımsız Ölçeklendirme: Kendi spesifik yüküne bağlı olarak yatay veya dikey olarak ölçeklendirilebilir.
  • Bağımsız Test: İzole bir şekilde doğrulanabilir.
  • Tek Sorumluluk: Değiştirilmesi veya değiştirilmesi için birincil bir nedeni vardır. Uyumlu bir görevi yerine getirir ve kolayca anlaşılır.

2.2 Tek Sorumluluk Örnekleri

Bir mikroservisin yaptığı "tek şey" işlevsel veya çapraz-işlevsel (işlevsel olmayan) olabilir:

  • İşlevsel: Belirli bir alan kaynağına hizmet etmek (örneğin, bir Kullanıcı servisi, bir Makale servisi, sigortada bir Risk hesaplama servisi).
  • Çapraz-işlevsel: Bir mesajı okuyan, iş mantığı uygulayan ve ileten bir kuyruk işlemcisi. Önbellekleme veya günlükleme gibi belirli bir işlevsel olmayan gereksinimden sorumluluk.

3. Mikroservislerin Yükselişi

3.1 Popülerliğin Güdüleri

Mikroservislerin popülerliği, yaygın bir endüstri sıkıntısına atfedilir: yönetilemez monolitik uygulama. Kuruluşlar, 5-10 yıl boyunca büyümüş, SaaS olarak dağıtılması veya bulutta etkili bir şekilde ölçeklendirilmesi çok zor hale gelmiş uygulamalarla karşı karşıyadır.

3.2 Teknik Borçla Başa Çıkmak

Mikroservisler, bu monolitleri, işlem dışında çalışan daha küçük, işbirliği yapan bileşenlere bölmek için bir çözüm olarak ortaya çıktı. Netflix gibi şirketler tarafından büyük ölçekte gösterilen bu yaklaşım, bağımsız bakım, ölçeklendirme ve değiştirme imkanı sağlar. Temel güdü, yazılımı daha hızlı teslim etme ve monolitik mimariler tarafından engellenen sürekli teslimat gibi uygulamalardan yararlanma ihtiyacıdır.

4. Benimseme & Uygulama Kalıpları

4.1 Yeşil Alan vs. Kahverengi Alan

Önemli bir soru, yeni bir projeye mikroservislerle başlamak (yeşil alan) mı yoksa mevcut bir monoliti onlara yeniden düzenlemek (kahverengi alan) mı gerektiğidir. Tartışma, ampirik olarak çoğu kuruluşun bir monolit ile başladığını ve daha sonra mevcut kod tabanındaki sınırlı bağlamları ve dikişleri belirleme zorluğuyla karşılaşarak yeniden düzenlediğini belirtmektedir.

4.2 Operasyonel Karmaşıklık

Podcast alıntısı, alan sınırlamalarının operasyonel karmaşıklık ve DevOps üzerindeki etkisi hakkında tam bir tartışmayı engellediğinden bahsetmektedir. Bu, mikroservisler geliştirme ve ölçeklenebilirlik sorunlarını çözerken, izleme, dağıtım orkestrasyonu ve ağ güvenilirliği konularında yeni zorluklar getirdiği anlamına gelir.

5. Temel İçgörüler & Analiz

Temel İçgörü

Mikroservisler sihirli bir değnek teknolojisi değildir; monolitik geliştirmenin darboğazına organizasyonel ve ekonomik bir yanıttır. Netflix örneğinin ima ettiği gibi, gerçek değer önerisi, bağımsız, paralel değer teslim akışlarını mümkün kılmaktır. Bu mimari, tek bir kod tabanı üzerinde çalışan büyük ekipleri rahatsız eden koordinasyon maliyetlerini ve dağıtım sürtüşmesini doğrudan hedefler. Bu sorun, Melvin Conway'in "sistemleri tasarlayan organizasyonlar... bu organizasyonların iletişim yapılarının kopyaları olan tasarımlar üretmekle sınırlıdır" vecizesiyle resmileştirilmiştir. Mikroservisler, istenen iletişim yapılarını zorlayan sistemler tasarlayarak bunu tersine çevirmeye çalışır.

Mantıksal Akış

Anlatı, zorlayıcı bir neden-sonuç zinciri izler: (1) Monolitler teknik borç biriktirir ve değişime karşı felç olur. (2) İş, bulut ölçeklenebilirliği ve sürekli teslimat talep eder. (3) Monolitik mimari, bağlantısı nedeniyle bu hedeflerle temelde uyumsuzdur. (4) Çözüm, monoliti sınırlı bağlamlar boyunca kırarak bağımsız dağıtılabilir birimler oluşturmaktır. Bu mantık sağlamdır ancak muazzam ara karmaşıklığı—kırılmanın "nasıl"ını—görmezden gelir.

Güçlü & Zayıf Yönler

Güçlü Yönler: Bağımsız dağıtılabilirlik üzerine odaklanmak, temel özellik olarak doğrudur. Bu, ekip özerkliğini ve daha hızlı sürüm döngülerini açan kaldıraçtır. Conway Yasası ve CQRS (atlanan konular olarak bahsedilen) ile bağlantı, devrede olan daha derin sosyo-teknik kalıpların farkında olunduğunu gösterir.

Zayıf Yönler: 2015 perspektifi, "tek sorumluluk" tanımlamanın kolaylığı konusunda fark edilir şekilde iyimserdir. Sonraki endüstri deneyimi, bunun en zor kısım olduğunu—dağıtılmış monolitlere yol açan kötü tanımlanmış servis sınırlarının laneti—ortaya çıkarmıştır. Transkript ayrıca operasyonel yükü tehlikeli bir şekilde hafife alır. Fowler'ın temel makalesi daha sonra detaylandırdığı gibi, geliştirme karmaşıklığını operasyon karmaşıklığı ile takas edersiniz. Docker'dan "popüler bir parça" olarak bahsedilmesi tarihsel bir anlık görüntüdür; konteynerleştirme ekosistemi, mikroservisleri büyük ölçekte pratik olarak uygulanabilir kılan eksik operasyonel kolaylaştırıcıydı.

Uygulanabilir İçgörüler

Liderler için: Mikroservislere moda olduğu için başlamayın. Değişiklikler için öncül sürenizi ve dağıtım sıklığınızı ölçerek başlayın. Kod tabanı koordinasyonu nedeniyle kötüyse, mikroservisleri düşünün. Mimariler için: Birincil tasarım aracı bir teknoloji kontrol listesi değil, bir alan odaklı tasarım (DDD) bağlam haritasıdır. Sınırları teknik katmanlara değil, iş yeteneklerine göre tanımlayın. Ekipler için: Platform mühendisliğine önceden yatırım yapın—otomatik dağıtım, servis keşfi ve gözlemlenebilirlik sonradan akla gelenler değildir; bunlar temeldir. Önerilen yol—bir monoliti yeniden düzenlemek—hala en akıllıcasıdır. Monolitin parçalarını servislerle artımlı olarak değiştirmek için Boğucu İncir Desenini kullanın, çünkü bu riski yönetir ve öğrenmeye izin verir.

6. Teknik Çerçeve & Matematiksel Modeller

Podcast konuşma şeklinde olsa da, altında yatan ilkeler resmileştirilebilir. Temel bir model, ekip büyüklüğü (N), iletişim yolları ve mimari bağlantı arasındaki ilişkidir.

N ekipli monolitik bir mimaride, potansiyel iletişim yolları $O(N^2)$ ile ölçeklenir, çünkü bir modüldeki değişiklikler birçok diğerini etkileyebilir. Bu, koordinasyon yükü yaratır. Mikroservisler, sınırlı bağlamlar ve API'ler zorlayarak bunu azaltmayı amaçlar. Amaç, servisler arası iletişim maliyeti olan $C_{comm}$'i ağ çağrıları yoluyla açıkça yüksek yaparak, değişim maliyeti $C_{internal}$'in düşük olduğu bir servis içinde güçlü modülerliği teşvik etmektir.

Değişim yayılma olasılığı ($P_{prop}$) için basitleştirilmiş bir model şöyle olabilir:

$P_{prop} \approx \frac{C_{comm}}{C_{comm} + C_{internal}}$

Burada iyi tasarlanmış bir mikroservis mimarisi, $C_{comm}$'i (ağ gecikmesi, API sürümleme) sınır ötesi değişiklikler için baskın faktör yaparak, ilgisiz değişiklikler için $P_{prop}$'u en aza indirir.

7. Deneysel Sonuçlar & Vaka Çalışmaları

Podcast, Netflix'i birincil bir vaka çalışması olarak gösterir. 2015 yılına gelindiğinde, Netflix monolitik arka ucunu yüzlerce mikroservise ayrıştırarak şunları mümkün kılmıştı:

  • Bağımsız Ölçeklendirme: Film önerisi veya faturalandırma gibi servisler, pik yükler sırasında bağımsız olarak ölçeklendirilebilir.
  • Hızlı İnovasyon: Ekipler, tam yığın koordinasyonu olmadan servislerini günde birkaç kez dağıtabilir.
  • Teknoloji Heterojenliği: Farklı servisler, görevleri için en uygun dilde yazılabilir (örneğin, Java, Node.js).

Grafik Açıklaması (Varsayımsal): Monolitik bir uygulamayı mikroservis mimarisiyle iki eksende karşılaştıran bir çubuk grafik: (1) Dağıtım Sıklığı (Günlük Dağıtım): Monolit düşük bir çubuk gösterir (örneğin, 0.1), Mikroservisler yüksek bir çubuk gösterir (örneğin, 50+). (2) Bir hatadan Kurtarma İçin Ortalama Süre (MTTR): Monolit yüksek bir çubuk gösterir (örneğin, 4 saat), Mikroservisler daha düşük bir çubuk gösterir (örneğin, 30 dakika), çünkü hatalar belirli servislere izole edilebilir.

Sonraki çalışmalar, örneğin DevOps Raporlarının Durumu'nda referans verilenler, gevşek bağlı, servis odaklı mimarileri daha yüksek yazılım teslim performansı ile istatistiksel olarak ilişkilendirmiştir.

8. Analiz Çerçevesi: Pratik Bir Örnek

Senaryo: Bir e-ticaret monoliti güncellemelerde zorlanıyor. "Ödeme" özelliği değişiklikleri tam regresyon testi gerektiriyor ve "ürün kataloğu" güncellemeleriyle çakışıyor.

Çerçeve Uygulaması:

  1. Sınırlı Bağlamları Belirleyin: Alan Odaklı Tasarım kullanarak temel alanları belirleyin: Sipariş, Katalog, Envanter, Kullanıcı Yönetimi, Ödeme.
  2. Servis Sınırlarını Tanımlayın: Her bağlam için bir mikroservis oluşturun. Sipariş Servisi, ödeme mantığına ve sipariş verilerine sahiptir.
  3. Sözleşmeleri Belirleyin: Net API'ler tanımlayın. Sipariş Servisi, Ödeme Servisi'nin processPayment(orderId, amount) API'sini ve Envanter Servisi'nin reserveStock(itemId, quantity) API'sini çağıracaktır.
  4. Veri Sahipliği: Her servis kendi veritabanına sahiptir. Sipariş Servisi'nin kendi "orders" tablosu vardır; Envanter veritabanını doğrudan sorgulamaz.
  5. Dağıtım & Gözlemlenebilirlik: Her servis konteynerleştirilir, bağımsız olarak dağıtılır ve metrikleri (gecikme, hata oranı) merkezi bir panoya yayınlar.

Sonuç: Ödeme ekibi artık, katalog veya envanter ekiplerini dahil etmeden Sipariş Servisi'ne güncellemeler dağıtabilir, bu da koordinasyon yükünü önemli ölçüde azaltır ve dağıtım sıklığını artırır.

9. Gelecekteki Uygulamalar & Araştırma Yönleri

Mikroservislerin evrimi, 2015 bakış açısının ötesinde devam etmektedir:

  • Servis Ağları: Istio ve Linkerd gibi teknolojiler, kesen ilgileri (güvenlik, gözlemlenebilirlik, trafik yönetimi) altyapı katmanında ele almak için ortaya çıkmıştır, böylece bireysel servislerin kod yükünü azaltır.
  • Sunucusuz & FaaS: Fonksiyon-olarak-servis (örneğin, AWS Lambda), mikroservislerin aşırı bir formunu temsil eder, operasyonel karmaşıklığı tamamen bulut sağlayıcısına iter ve daha da ince taneli ölçeklendirmeyi mümkün kılar.
  • AI/ML Entegrasyonu: Mikroservisler, ML modellerini bağımsız tahmin servisleri olarak dağıtmak için fiili kalıp haline gelmektedir, bu da A/B testi ve algoritmaların hızlı yinelemesine izin verir.
  • Kenar Bilişimi: IoT ve gerçek zamanlı analiz senaryolarında düşük gecikmeli işleme için hafif mikroservislerin kenar cihazlarına dağıtılması.
  • Araştırma Odağı: Gelecekteki araştırmalar, otomatik servis ayrıştırma araçlarında, dağıtık sistemlerde akıllı hata tahmininde ve servis koreografilerindeki etkileşimlerin resmi doğrulamasında gereklidir.

10. Referanslar

  1. Lewis, J., & Fowler, M. (2014). Microservices. MartinFowler.com. Şu adresten alındı: https://martinfowler.com/articles/microservices.html
  2. Newman, S. (2015). Building Microservices. O'Reilly Media.
  3. Forsgren, N., Humble, J., & Kim, G. (2018). Accelerate: The Science of Lean Software and DevOps. IT Revolution Press.
  4. Conway, M. E. (1968). How Do Committees Invent? Datamation, 14(5), 28-31.
  5. Google Cloud. (2019). The 2019 Accelerate State of DevOps Report. DORA.
  6. Netflix Technology Blog. (Various). https://netflixtechblog.com/