eShopOnContainers'da DDD mikro hizmetindeki CQRS ve CQS yaklaşımlarını uygulama
İpucu
Bu içerik, .NET Docs'ta veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak sağlanan Kapsayıcılı .NET Uygulamaları için .NET Mikro Hizmet Mimarisi e-Kitabı'ndan bir alıntıdır.
eShopOnContainers başvuru uygulamasında sipariş mikro hizmetinin tasarımı CQRS ilkelerini temel alır. Ancak, sorguları komutlardan ayıran ve her iki eylem için de aynı veritabanını kullanan en basit yaklaşımı kullanır.
Bu desenlerin özü ve buradaki önemli nokta, sorguların bir kez etkili olmasıdır: Bir sistemi kaç kez sorgularsanız sorgulasanız da, bu sistemin durumu değişmez. Başka bir deyişle, sorgular yan etkisizdir.
Bu nedenle, sipariş mikro hizmetleri aynı veritabanını kullanıyor olsa bile işlem mantığı "yazar" etki alanı modelinden farklı bir "okur" veri modeli kullanabilirsiniz. Bu nedenle, bu basitleştirilmiş bir CQRS yaklaşımıdır.
Öte yandan, işlemleri ve veri güncelleştirmelerini tetikleyen komutlar sistemdeki durumu değiştirir. Komutlarla, karmaşıklık ve sürekli değişen iş kurallarıyla ilgilenirken dikkatli olmanız gerekir. Daha iyi modellenmiş bir sisteme sahip olmak için DDD tekniklerini uygulamak istediğiniz yer burasıdır.
Bu kılavuzda sunulan DDD desenleri evrensel olarak uygulanmamalıdır. Tasarımınızda kısıtlamalara neden olurlar. Bu kısıtlamalar, özellikle sistem durumunu değiştiren komutlarda ve diğer kodlarda zaman içinde daha yüksek kalite gibi avantajlar sağlar. Ancak bu kısıtlamalar, verileri okuma ve sorgulama açısından daha az avantajla karmaşıklık getirir.
Bu tür desenlerden biri, sonraki bölümlerde daha fazla incelediğimiz Toplama desenidir. Kısaca, Toplama düzeninde, birçok etki alanı nesnesini etki alanındaki ilişkilerinin bir sonucu olarak tek bir birim olarak ele alırsınız. Sorgularda bu desenden her zaman avantaj elde edemeyebilirsiniz; sorgu mantığının karmaşıklığını artırabilir. Salt okunur sorgular için, birden çok nesneyi tek bir Toplama olarak ele alma avantajından yararlanamayın. Yalnızca karmaşıklığı elde edersiniz.
Önceki bölümde Şekil 7-2'de gösterildiği gibi, bu kılavuz DDD desenlerinin yalnızca mikro hizmetinizin işlem/güncelleştirme alanında (komutlar tarafından tetiklendiğinde) kullanılmasını önerir. Sorgular daha basit bir yaklaşımı izleyebilir ve CQRS yaklaşımını izleyerek komutlardan ayrılmalıdır.
"Sorgular tarafını" uygulamak için, EF Core, AutoMapper projeksiyonları, saklı yordamlar, görünümler, gerçekleştirilmiş görünümler veya mikro ORM gibi tam kapsamlı ORM'nizden birçok yaklaşım arasından seçim yapabilirsiniz.
Bu kılavuzda ve eShopOnContainers'da (özellikle sipariş mikro hizmeti) Dapper gibi bir mikro ORM kullanarak düz sorgular uygulamayı seçtik. Bu kılavuz, çok az ek yüke sahip hafif bir çerçeve sayesinde en iyi performansı elde etmek için SQL deyimlerini temel alan herhangi bir sorguyu uygulamanıza olanak tanır.
Bu yaklaşımı kullandığınızda, modelinizde varlıkların SQL veritabanında kalıcı hale getirilip kalıcı hale getirilemediğini etkileyen tüm güncelleştirmeler, Dapper tarafından kullanılan SQL sorgularında ayrı güncelleştirmelere veya sorgulamaya yönelik diğer ayrı (EF olmayan) yaklaşımlara da ihtiyaç duyar.
CQRS ve DDD desenleri üst düzey mimariler değildir
CQRS ve çoğu DDD desenlerinin (DDD katmanları veya toplamalı bir etki alanı modeli gibi) mimari stil olmadığını, yalnızca mimari desenleri olduğunu anlamak önemlidir. Mikro hizmetler, SOA ve olay odaklı mimari (EDA), mimari stillerine örnek olarak verilebilir. Bunlar, birçok mikro hizmet gibi birçok bileşenden oluşan bir sistemi açıklar. CQRS ve DDD desenleri tek bir sistem veya bileşen içindeki bir şeyi tanımlar; bu durumda, mikro hizmet içindeki bir şey.
Farklı Sınırlanmış Bağlamlar (BC) farklı desenler kullanır. Farklı sorumlulukları vardır ve bu da farklı çözümlere yol açar. Her yerde aynı deseni zorlamanın hataya yol açtığını vurgulamada fayda vardır. CQRS ve DDD desenlerini her yerde kullanmayın. Birçok alt sistem, BC veya mikro hizmet daha basittir ve basit CRUD hizmetleri veya başka bir yaklaşım kullanılarak daha kolay uygulanabilir.
Yalnızca bir uygulama mimarisi vardır: tasarladığınız sistemin veya uçtan uca uygulamanın mimarisi (örneğin, mikro hizmetler mimarisi). Ancak, bu uygulama içindeki her Sınırlanmış Bağlamın veya mikro hizmetin tasarımı, mimari desenleri düzeyinde kendi dezavantajlarını ve iç tasarım kararlarını yansıtır. Her yerde CQRS veya DDD ile aynı mimari desenleri uygulamayı denemeyin.
Ek kaynaklar
Martin Fowler. CQRS
https://martinfowler.com/bliki/CQRS.htmlGreg Young. CQRS Belgeleri
https://cqrs.files.wordpress.com/2010/11/cqrs_documents.pdfUdi Dahan. Netleştirilmiş CQRS
https://udidahan.com/2009/12/09/clarified-cqrs/