Mert Özen Her Satırda Daha İleri

Blog

Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.

Seriler
11 yazı bulundu #cqrs
Message Türleri: Command, Event ve Query; Event Notification ve Event-Carried State Transfer
Yazılım Mimarisi SERİ 02

Message Türleri: Command, Event ve Query; Event Notification ve Event-Carried State Transfer

Command emir kipindedir ve tek bir alıcıya gider, event geçmiş zamanda bir olgudur ve alıcılarını tanımaz, query ise cevap bekler; bu ayrım message'ın adını, contract sahibini ve channel'ını belirler. MessageId, correlation ve causation id taşıyan bir envelope, Fowler'ın event notification ve event-carried state transfer ayrımı ve domain event ile integration event farkı gerçek çıktılarla.

7 Kas 2026 12 dk 6
CQRS ve Event Sourcing Ne Zaman Gereksiz? Anti-Pattern'ler ve Karar Rehberi
Yazılım Mimarisi SERİ 10

CQRS ve Event Sourcing Ne Zaman Gereksiz? Anti-Pattern'ler ve Karar Rehberi

CQRS ve event sourcing düz CRUD'da, MVP'de, statik referans verisinde, anlık tutarlı görünüm şartında ve deneyimsiz ekipte gereksizdir; her bounded context için ayrı karar verilir. Bookstore'un context haritası, CQRS seviye 1/2/3 ve event sourcing için bir karar akışı ve dört anti-pattern: tek veritabanında CQRS töreni, her yerde event sourcing, state-change event'leri ve iç event'i integration contract yapmak.

7 Kas 2026 11 dk 5
Event Sourcing'in Zor Konuları: GDPR, Unique Constraint ve Dynamic Consistency Boundary
Yazılım Mimarisi SERİ 09

Event Sourcing'in Zor Konuları: GDPR, Unique Constraint ve Dynamic Consistency Boundary

Kişisel veriyi event'in dışında tut, kalması gerekiyorsa crypto-shredding ile şifrele; stream'ler arası benzersizliği doğal anahtarlı stream id ya da unique index'li Inline projection ile, iki aggregate'e yayılan kuralları Dynamic Consistency Boundary ile koru. Marten 9 ile AES-GCM crypto-shredding, iki eşzamanlı kayıt yarışı, DcbConcurrencyException ile kampanya kotası ve replay'de dış servis çağırmamak.

7 Kas 2026 14 dk 4
Event Versioning ve Snapshot: Event Schema'sını Kırmadan Değiştirmek
Yazılım Mimarisi SERİ 08

Event Versioning ve Snapshot: Event Schema'sını Kırmadan Değiştirmek

Yazılmış event'ler değiştirilmez; yeni kod eski şekilleri tolerant deserialization, sabit JSON adları ve upcaster ile okur, snapshot ise ölçümle ve rebuild ile birlikte açılır. Sessizce sıfırlanan bir property rename'i, RespectRequiredConstructorParameters, Marten upcaster'ı, namespace taşırken Türkçe culture alias'ının kırılması, in-place migration'ın bedeli, snapshot serialization tuzağı ve closing the books.

7 Kas 2026 12 dk 5
Projection'lar: Inline, Async ve Live Projection ile Read Model Üretmek
Yazılım Mimarisi SERİ 07

Projection'lar: Inline, Async ve Live Projection ile Read Model Üretmek

Projection, event'leri belli bir soruya göre şekillenmiş bir read model'e çeviren fonksiyondur; Inline event'lerle aynı transaction'da, Async daemon ile arka planda çalışır, Live hiç saklanmaz. Bookstore stok defterinden stok rozeti, aylık stok hareketi ve kargo bekleyen rezervasyonlar; checkpoint, projection'ı değiştirip rebuild etmek, dead letter ve başarısız rebuild'in read model'i boşaltması.

7 Kas 2026 13 dk 5
Event Store ile Çalışmak: Marten ve PostgreSQL'de Append, Optimistic Concurrency ve Stream'ler
Yazılım Mimarisi SERİ 06

Event Store ile Çalışmak: Marten ve PostgreSQL'de Append, Optimistic Concurrency ve Stream'ler

Event store'un temel sözleşmesi, bir stream'e yalnızca beklenen version'dayken event eklemektir; Marten bunu PostgreSQL'de (stream_id, version) unique index'i ve FetchForWriting ile sağlar. Marten 9 kurulumu, StartStream/Append, decider'ı FetchForWriting'e bağlamak, iki yazarın yarışı, stream id stratejileri, KurrentDB ve kendi tablonu yazmanın bedeli ve Türkçe culture'da bozulan event adları.

7 Kas 2026 16 dk 4
Decider Pattern ile Event-Sourced Aggregate: decide, evolve ve Given-When-Then Test'leri
Yazılım Mimarisi SERİ 05

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.

7 Kas 2026 14 dk 4
Event Sourcing Nedir? State Yerine Olanları Saklamak
Yazılım Mimarisi SERİ 04

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.

7 Kas 2026 14 dk 5
Ayrı Read Model: Materialized View, Senkronizasyon ve Eventual Consistency ile Yaşamak
Yazılım Mimarisi SERİ 03

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.

7 Kas 2026 14 dk 5
Tek Veritabanında CQRS: Write Tarafında Aggregate, Read Tarafında Projection
Yazılım Mimarisi SERİ 02

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.

7 Kas 2026 14 dk 5
CQRS Nedir? CQS'ten Command Query Responsibility Segregation'a
Yazılım Mimarisi SERİ 01

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.

7 Kas 2026 12 dk 5
Blog Haritası