Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
CQRS Nedir? CQS'ten Command Query Responsibility Segregation'a
CQRS, tek bir modeli yazma (command) ve okuma (query) için iki ayrı modele bölmektir; Meyer'in method seviyesindeki CQS ilkesini Greg Young model seviyesine taşıdı. Aggregate'in liste ekranına neden uymadığını gerçek bir derleme hatası ve sayımla gösteriyor, CQRS'in üç seviyesini, Event Sourcing ve MediatR'dan farkını ve Fowler'ın 'yalnız gerektiği yerde' uyarısını işliyoruz.
Tek Veritabanında CQRS: Write Tarafında Aggregate, Read Tarafında Projection
Tek veritabanında CQRS, yazma tarafında aggregate'i EF Core'un change tracker'ıyla kaydedip okuma tarafında aynı tablolardan aggregate'e hiç dokunmadan projection yapmaktır. PlaceOrder ve CancelOrder command'larının ne döndürmesi gerektiği, ayrı ve düz bir read DbContext, SQL view üstünde Dapper ve query'nin state değiştirmediğini PostgreSQL'e read-only transaction ile söyletmek, gerçek SQL ve 25006 hatasıyla.
Ayrı Read Model: Materialized View, Senkronizasyon ve Eventual Consistency ile Yaşamak
Ayrı read model, ekranın satırını domain event'lerinden önceden hesaplayıp saklamaktır; aynı transaction'da güncellenirse tutarlılık anlık kalır, ayrı bir veritabanında asenkron güncellenirse eventual consistency ile yaşamak gerekir. Inline projection, PostgreSQL materialized view, checkpoint'li asenkron projector, read-your-own-writes için position ile bekleme, idempotent update ve sıfırdan rebuild, gerçek çıktılarla.
Event Sourcing Nedir? State Yerine Olanları Saklamak
Event Sourcing, son durumu değil olanları append-only bir event stream'inde saklayıp state'i bu event'lerden fold ederek türetmektir. Bookstore'un stok defteriyle rehydration, audit, geçmişe dönük okuma, expected version ile optimistic concurrency, event store'un neden bir message broker olmadığı, CQRS ile neden birlikte kullanıldığı ve gerçek maliyetleri.
Decider Pattern ile Event-Sourced Aggregate: decide, evolve ve Given-When-Then Test'leri
Decider pattern, event-sourced bir modelin karar mantığını iki saf fonksiyona ayırır: Decide command ve state'ten yeni event'leri, Evolve state ve bir event'ten yeni state'i üretir. Stok defteri için C# 14 switch expression'larıyla bir decider, zamanı TimeProvider ile command'a taşımak, veritabanısız Given-When-Then test'leri ve OOP aggregate stiliyle karşılaştırma, gerçek test çıktılarıyla.