Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Microservices Nedir, Ne Değildir? Independent Deployability ve Information Hiding
Microservice, bir business domain etrafında modellenmiş ve diğerlerine dokunmadan deploy edilebilen service'tir; ölçüt boyut değil, independent deployability ve information hiding'dir. Lewis ve Fowler'ın dokuz özelliği, Newman'ın tanımı, contract ile iç modeli ayırmanın C#'taki karşılığı, SOA farkı ve Bookstore'un service adayları.
Microservice'lerin Bedeli: Ne Zaman Gereksiz, Ne Zaman Kaçınılmaz?
Microservices tek ekipli, ön koşulları (otomatik provisioning, monitoring, hızlı deploy) olmayan bir sistem için gereksizdir; birbirini bekleyen ekipler ve farklı ölçeklenen parçalar ölçülebilir hâle geldiğinde kaçınılmaz olur. Network çağrısının gerçek maliyeti ölçülerek, fallacies of distributed computing, Fowler'ın prerequisite'leri, Prime Video vakasının doğru okunuşu ve Bookstore için bir karar checklist'i.
Service Boundary'lerini Çizmek: Business Capability, Bounded Context ve Coupling Türleri
Service sınırı tablolara ya da entity'lere göre değil, birlikte değişen iş kurallarına göre çizilir: bir service en fazla bir bounded context içerir ve tek bir ekibin sahipliğindedir. Business capability ile subdomain yaklaşımı, Microsoft'un sınır rehberi, Newman'ın domain, pass-through, common ve content coupling türleri, entity service anti-pattern'i ve Customer'ın üç context'teki üç ayrı modeli.
Data Ownership ve Database per Service: Shared Database'den Neden Kaçınılır?
Shared database, hiçbir contract'ta görünmeyen bir coupling yaratır; her service'in verisi ona private olmalı ve başkaları bu veriye API composition, event'le replike edilen local kopya ya da CQRS read model ile ulaşmalı. SQL Server'da schema seviyesinde yetkiyle sınırı zorlamak, BookRenamed ile version kontrollü kopya, snapshot farkı, reference data ve raporlama için CDC.
Microservice'lerde Transaction Yok: Eventual Consistency'yi Tasarımla Kabullenmek
Service'ler arasında distributed transaction (2PC) kullanılmaz; anında tutarlılık gereken kural tek service'te tutulur, birden fazla service'e yayılan akış saga ve compensating action'larla, event'ler outbox ile kurulur. TransactionScope'un Linux ve macOS'ta verdiği gerçek hata, choreography ile çalışan bir checkout saga'sı, domain'deki ara durumlar ve 202 Accepted ile kullanıcıya gösterilen eventual consistency.
Microservice İletişim Stilleri: Sync Request/Response, Async Event ve Temporal Coupling
Çağıran cevabı beklemek zorundaysa iletişim, kod ne kadar await'li olursa olsun senkrondur ve iki service'i temporal coupling ile birbirine bağlar; cevap şimdi gerekmiyorsa event ya da local kopya tercih edilir. REST, gRPC (deadline'ın server'a taşınması dahil) ve message karşılaştırması, Inventory deploy edilirken checkout simülasyonu, command ile event farkı ve bir karar tablosu.
Service Contract'ları ve Versioning: Expand-Contract, Tolerant Reader ve Consumer-Driven Contract Test
Bir değişikliğin breaking olup olmadığı yalnız provider'ın koduna bakarak anlaşılmaz; consumer'ların ne okuduğunu bilmek gerekir, bu yüzden consumer tolerant reader olur, provider kırıcı değişikliği expand-contract ile adımlara böler ve consumer-driven contract test'le deploy'dan önce kimi kıracağını görür. TypeScript consumer ve .NET provider arasında Pact ile gerçek doğrulama çıktıları, Deprecation/Sunset header'ları ve versioning'in service seviyesindeki bedeli.
API Gateway ve Backend for Frontend: Edge'de Ne Olur, Ne Olmamalı?
API Gateway her client için aynı olan edge işlerini (routing, TLS termination, token doğrulama, rate limiting) yapar; bir kullanıcı deneyimine özgü aggregation, response şekillendirme ve token handling ise o deneyimin ekibine ait Backend for Frontend'e aittir, iş kuralı ikisine de girmez. Kitap detay sayfası için üç service'i paralel çağıran ve Inventory çöktüğünde sayfayı düşürmeyen gerçek bir BFF endpoint'i, RFC 10017'nin BFF önerisi ve god gateway tuzağı.
Service Discovery: Client-Side, Server-Side, Kubernetes DNS ve .NET Service Discovery
Service discovery, client'ın "Inventory" gibi mantıksal bir adı o an sağlıklı çalışan instance adreslerine çevirmesidir; Kubernetes bunu Service ve DNS ile server-side yapar, .NET'te Microsoft.Extensions.ServiceDiscovery aynı kodla geliştirme ortamında configuration'dan, cluster'da platformun DNS'inden adres bulur. Round robin'in gerçek çıktısı, listede kalan ölü bir instance'ın isteklerin üçte birini düşürmesi ve service mesh'in ne zaman gerekmediği.
Production'da Microservice: Distributed Tracing, Resilience ve Independent Deployment
Production'da microservice işletmek üç şey ister: bir isteği service'ler boyunca izleyen distributed tracing (W3C traceparent ile), service seviyesinde düşünülmüş timeout, retry ve circuit breaker, ve her service'in kendi pipeline'ıyla, backward compatibility ve contract test'lerle bağımsız deploy edilmesi. .NET'in Activity'siyle gerçek bir trace çıktısı, katman başına retry'ın 64 isteğe dönüşmesi, readiness'ı downstream'e bağlama tuzağı ve can-i-deploy'un CI'daki yeri.
Monolith'ten Microservice'e: Strangler Fig, Branch by Abstraction ve Distributed Monolith Tuzağı
Monolith'ten microservice'e sıfırdan yeniden yazarak değil, monolith'in önüne bir proxy koyup yetenekleri tek tek dışarı alarak (strangler fig) geçilir; proxy'den geçmeyen iç çağrılar branch by abstraction ile ayrılır, yeni yol parallel run'da gölgede doğrulanır ve hedef bağımsız deploy edilebilen service'ler olur, distributed monolith değil. YARP ile gerçek route çıktısı, dry run'lı parallel run'ın yakaladığı bir fark, önce veri mi önce kod mu kararı ve service konsolidasyonu.