CQRS
Command Query Responsibility Segregation (Komut Sorgu Sorumluluğu Ayrımı)
Kısaca
CQRS, veriyi değiştiren kodu (komutlar) veriyi okuyan koddan (sorgular) ayırarak iki ayrı modele bölen bir mimari desendir.
CQRS nedir?
Command Query Responsibility Segregation'ın kısaltması olan CQRS, bir uygulamanın işlemlerini iki tarafa böler. Komutlar (command) PlaceOrder ya da ChangeAddress gibi durumu değiştirir ve çok az şey döndürür ya da hiçbir şey döndürmez; sorgular (query) ise sipariş geçmişini getirmek gibi durumu okur ve hiçbir şeyi değiştirmez. Her tarafın kendi işi için tasarlanmış ayrı bir modeli vardır.
Yazma modeli iş kurallarına ve doğrulamaya odaklanırken okuma modeli, çoğunlukla önceden birleştirilmiş, denormalize görünümler olarak hızlı ve kullanışlı gösterim için şekillendirilir. Basit kurulumlarda iki taraf da farklı kod yollarıyla aynı veritabanını kullanır. Daha gelişmiş kurulumlarda okuma tarafının kendi veritabanı ya da tabloları vardır ve bunlar yazma tarafından yayınlanan olaylarla güncel tutulur; bu, okumaların yazmaların biraz gerisinde kalabileceği anlamına gelir ve bu özelliğe nihai tutarlılık (eventual consistency) denir.
Restoran bir benzetmedir: siparişler, her yemeği katı kurallara göre hazırlayan mutfağa gider; misafirler ise hızlıca göz gezdirmek için tasarlanmış basılı bir menüyü okur. CQRS, okumaların yazmalardan çok daha fazla olduğu, okuma ve yazmanın çok farklı veri şekilleri gerektirdiği ya da karmaşık iş alanlarında yararlıdır ve çoğunlukla event sourcing ve domain-driven design ile birlikte kullanılır.
CQRS sıklıkla, tek bir model ve bir tablo kümesinin oluşturma, okuma, güncelleme ve silme işlemlerini birlikte yürüttüğü CRUD ile karşılaştırılır. CRUD daha basittir ve çoğu uygulama için doğru varsayılandır; CQRS ise ek kod, daha fazla hareketli parça ve yazmalarla okumalar arasında olası gecikme getirir. CQRS, her değişikliği bir olay olarak saklayan event sourcing'den de farklıdır: ikisi birlikte iyi çalışır, ancak biri diğeri olmadan da kullanılabilir.
Önemli noktalar
- Komutlar veriyi değiştirir; sorgular veriyi okur ve asla değiştirmez.
- Her tarafın amacına göre optimize edilmiş kendi modeli vardır.
- Okuma tarafı ayrı, denormalize görünümler ya da veritabanları kullanabilir.
- Ayrı okuma depoları çoğunlukla yazma tarafıyla nihai tutarlıdır.
- CQRS'i yalnızca açıkça işe yaradığı yerde kullanın; çoğu uygulama için sade CRUD daha basittir.
Örnek
// Command side: validates business rules and changes state
async function placeOrder(cmd: { customerId: string; items: string[] }) {
if (cmd.items.length === 0) throw new Error("An order needs at least one item");
const order = await writeDb.orders.insert({ ...cmd, status: "placed" });
await events.publish("order.placed", order); // used to update the read model
}
// Query side: reads from a view shaped for the screen and never changes data
async function getOrderSummaries(customerId: string) {
return readDb.orderSummaries.find({ customerId }); // pre-joined, denormalized
}Sık sorulan sorular
CQRS ile CRUD arasındaki fark nedir?
CRUD, veriyi oluşturma, okuma, güncelleme ve silme için tek bir model kullanır. CQRS ise yazmaları ve okumaları ayrı modellere böler; böylece her biri bağımsız olarak optimize edilebilir, bunun bedeli daha fazla karmaşıklıktır.
CQRS için iki veritabanı gerekir mi?
Hayır. CQRS yalnızca komut ve sorgu modellerinin kodunuzda ayrılmasını gerektirir. Ayrı okuma ve yazma veritabanları kullanmak, okumaları ölçeklemesi ya da veriyi çok farklı şekillerde saklaması gereken sistemler için isteğe bağlı bir adımdır.
CQRS ile event sourcing arasındaki fark nedir?
CQRS okumayı yazmadan ayırır; event sourcing ise yalnızca mevcut durumu değil, değişikliklerin tam geçmişini bir olay dizisi olarak saklar. Sıklıkla birlikte kullanılırlar ama her biri tek başına da kullanılabilir.
İlgili sayfalar
- Domain-Driven DesignYazılım Mimarisi, s. 12Domain-driven design, kodu iş alanına yakından modelleyen ve alan uzmanlarıyla aynı dili kullanan bir yazılım geliştirme yaklaşımıdır.
- Olay Güdümlü MimariYazılım Mimarisi, s. 29Olay güdümlü mimari, servislerin bir siparişin verilmesi gibi olaylar üreterek ve bunlara tepki vererek iletişim kurduğu bir yazılım tasarım tarzıdır.
- VeritabanıVeritabanları, s. 37Veritabanı, bilgisayarda düzenli biçimde saklanan ve uygulamaların verimlice kaydedip arayıp güncelleyebildiği, bir yazılımla yönetilen veri topluluğudur.
- MikroservislerYazılım Mimarisi, s. 24Mikroservisler, bir uygulamanın ağ üzerinden iletişim kuran, küçük ve bağımsız olarak dağıtılabilen servislere bölündüğü bir mimari tarzdır.
- İlgilerin AyrılmasıYazılım Mimarisi, s. 19İlgilerin ayrılması, bir programı her biri davranışının açıkça tanımlanmış tek bir yönünden sorumlu ayrı parçalara bölen bir tasarım ilkesidir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin