İçeriğe geç

Monolitten mikroservise: ne zaman, neden, nasıl

Klavye: ← → ile gezinin, F tam ekran, O genel bakış.

Tan, elinde bir planla

Muhammet Şafak — Sunumlar

Monolitten mikroservise

Ne zaman, neden, nasıl: sınırı bugün çizin, dağıtımı ölçülmüş bir sinyal gelince yapın.

Muhammet Şafak

Bölüm 01

Sınır

Modüler monolit: tek codebase, tek deploy, tek veritabanı; içeride net modül sınırları.

Üç yaklaşım

Sınır nerede duruyor?

Sınır nerede duruyor?
YaklaşımSınır
Klasik monolitSınır yok. Her şey her şeye erişir, zamanla "big ball of mud".
MikroservislerSınır var, ama sınır aynı zamanda bir network çağrısı.
Modüler monolitSınır var, ama sınır process içinde; bir method çağrısı.

Asıl mesele

Sınır ile servis ayrı iki karardır.

Sınırı bugün çizin, dağıtımı gerçekten gerekince yapın.

Sınır kodda

Modül başına tek public yüzey

Bir modül, başka bir modülün yalnızca *Api.php sınıfını çağırır. Başka modülün tablosuna doğrudan SELECT atmaz, foreign key bağlamaz.

app/Modules
app/└── Modules/  ├── Billing/  │   ├── Domain/         # modüle özel entity, value object  │   ├── Application/    # use-case'ler  │   ├── Infrastructure/ # repository, dış servis adaptörü  │   └── BillingApi.php  # modülün TEK public yüzeyi  ├── Catalog/  └── Notification/

Neden buradan başlıyorum

Beş somut sebep

  • Ucuz düzeltmeYanlış çizilen sınır bir refactor ile düzelir.
  • Tek transactionİki modül tek DB transaction'ında tutarlı güncellenir.
  • Az operasyonTek deploy, tek log akışı, izlenecek tek hedef.
  • Refactor araçlarıBir method çağrısını compiler doğrular.
  • Ucuz geçişNet sınırlı modülü servise çıkarmak mekanik bir iştir.
Tan, başparmağını kaldırmış onaylarken

Disiplin

Sınırı ayakta tutan dört pratik

  • Bağımlılık kuralı CI'da; ihlal build'i kırar (deptrac) (tamamlandı)
  • Her modülün dışarı açık API'si tek bir sınıf (tamamlandı)
  • Modüller arası ilişki foreign key değil, ID + public çağrı (tamamlandı)
  • Review sorusu: bu değişiklik bir modül sınırını izinsiz geçiyor mu? (tamamlandı)

Bütün değer disiplinde

CI zorlamıyorsa sınır yoktur.

Sınır CI tarafından zorlanmıyorsa, elinizde modüler monolit değil, sadece klasör isimleri düzgün bir monolit var.

Bölüm 02

Bedel

Mikroservis bir çözüm değil, bir takas.

Tek değişiklik

Method çağrısı network'e döner.

Aldığınız şey bağımsız deploy ve bağımsız ölçekleme. Karşılığında ödediğiniz şey uzun.

Takas

Mikroservisin faturası

MikroservisteMonolitte
ÇağrıSerializasyon, latency, partial failureIn-process, ücretsiz
TutarlılıkSaga, outbox, eventual consistencyTek DB transaction'ı
İzlemeDistributed tracing şartTek log akışı
DeployVersiyonlu, geriye uyumlu kontratlarTek deploy
RefactorKimsenin doğrulamadığı kontratCompiler doğrular

Yanlış gerekçeler

Doğru hastalığa yanlış ilaç

200 bin satırlık bir monolit ile 20 servise bölünmüş 200 bin satır aynı miktarda koddur; ikincisi sadece araya network koymuş hâlidir.
GerekçeAsıl çözüm
"Kod tabanı çok büyük."Modül sınırı, dosya düzeni, ölü kod temizliği
"Deploy yavaş ve korkutucu."Hızlı pipeline, test, aşamalı yayın, rollback
"Bağımsız ölçeklemem lazım."Monolit de yatay ölçeklenir: N kopya + load balancer
"Modern mimari bu."Modernlik mimari gerekçe değil
"Netflix böyle yapıyor."Problemi değil, yalnız operasyon yükü kopyalanır

Kod büyüklüğü

Aynı kod, araya network.

200 bin satırlık bir monolit ile 20 servise bölünmüş 200 bin satır aynı miktarda koddur; ikincisi sadece araya network koymuş hâlidir.

Bölüm 03

Sinyal

Şu sinyallerden en az biri ölçülmüş olmalı.

Ölçülmüş sinyaller

Geçişi haklı çıkaran dört sinyal

  • Ölçeklenme profiliBir parça kaynakları geri kalanından bambaşka tüketiyor.
  • SahiplikEkipler birbirinin deploy'unu bekliyor; sınır organizasyonel.
  • RuntimeÖlçülmüş darboğaz: iş yükü Go ya da Rust'ta belirgin ucuz.
  • Hata izolasyonuBir modülün çöküşü sistemi düşürmemeli; process içinde sağlanamıyor.

Eşik

Grafikte yoksa sinyal değildir.

Sinyal bir grafikte görünmüyorsa, henüz sinyal değildir.

Bölüm 04

Geçiş

Hepsini değil, sinyali veren tek modülü ayırın.

Strangler kalıbı

Tek modülü dışarı almak

  1. Adım 1: Modülü seçsinyali veren tek modül
  2. Adım 2: Servisi kuryeni servis ayağa kalkar
  3. Adım 3: Trafiği kaydırçağrılar kademeli yönlenir
  4. Adım 4: Eskiyi sileski kod silinir

Ne zaman, ne zaman değil

Ne zaman bölünür, nasıl bölünmez?

  • Big-bangHer şeyi aynı anda bölmek en pahalı ve en sık başarısız göçtür.
  • EkipBirden çok ekip aynı deploy biriminde sıkıştığında.
  • KaynakBir parçanın kaynak profili sistemin geri kalanını rehin aldığında.
  • ÇöküşBir bileşenin çöküşü düzenli olarak tüm sistemi düşürdüğünde.

Boring architecture

Karmaşıklık bütçesi sınırlı

  • PHP + Laravelya da Symfony; uygulama katmanı.
  • PostgreSQLİlişkisel veritabanı.
  • RedisBellek içi veri deposu.
  • NginxWeb sunucusu.
  • Linuxsystemd + Supervisor ile süreç yönetimi.
  • Yeni araçBenim eşiğim: boring sayılması için 12–18 ay üretimde aktif kullanım.
Tan, el sallarken

Teşekkürler

sade.dev

Sınırları erken çizin, dağıtımı geç yapın. Sinyali bekleyin; kararı moda değil, ölçüm versin.

Paylaş, göm, indir