Aracılığıyla paylaş


Mikro hizmette basitleştirilmiş CQRS ve DDD desenleri uygulama

Tavsiye

Bu içerik, .NET Docs veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak sağlanan Kapsayıcılı .NET Uygulamaları için .NET Mikro Hizmet Mimarisi adlı e-Kitap'tan bir alıntıdır.

.NET Mikro Hizmetler Mimarisi Kapsayıcılı .NET Uygulamaları için eKitabın kapak küçük resmi .

CQRS, verileri okuma ve yazma modellerini ayıran bir mimari desendir. İlgili Command Query Separation (CQS) terimi ilk olarak Bertrand Meyer tarafından Software ConstructionObject-Oriented adlı kitabında tanımlanmıştır. Temel fikir, bir sistemin işlemlerini keskin bir şekilde ayrılmış iki kategoriye bölebilmenizdir:

  • Sorgu. Bu sorgular bir sonuç döndürür ve sistemin durumunu değiştirmez ve yan etkileri yoktur.

  • Komutlar. Bu komutlar sistemin durumunu değiştirir.

CQS basit bir kavramdır: Aynı nesne içindeki yöntemlerin sorgular veya komutlar olmasıdır. Her yöntem ya durumu döndürür ya da durumu değiştirir, ancak ikisini birden yapmaz. Tek bir depo desen nesnesi bile CQS ile uyumlu olabilir. CQS, CQRS için temel bir ilke olarak kabul edilebilir.

Command and Query Responsibility Segregation (CQRS), Greg Young tarafından tanıtıldı ve Udi Dahan ve diğerleri tarafından güçlü bir şekilde tanıtıldı. Daha ayrıntılı olmasına rağmen CQS ilkesini temel alır. Komutlar ve olaylar temelli, isteğe bağlı olarak asenkron mesajlara dayanan bir desen olarak kabul edilebilir. Çoğu durumda CQRS, okumalar (sorgular) için yazma işlemlerinden (güncelleştirmeler) farklı bir fiziksel veritabanına sahip olmak gibi daha gelişmiş senaryolarla ilgilidir. Ayrıca, daha gelişmiş bir CQRS sistemi güncelleştirme veritabanınız için Event-Sourcing (ES) uygulayabilir, bu nedenle olayları geçerli durum verilerini depolamak yerine yalnızca etki alanı modelinde depolayabilirsiniz. Ancak bu yaklaşım bu kılavuzda kullanılmaz. Bu kılavuz, sorguları komutlardan ayırmayı içeren en basit CQRS yaklaşımını kullanır.

CQRS'nin ayırma yönü, sorgu işlemlerini bir katmanda ve komutları başka bir katmanda gruplandırarak elde edilir. Her katmanın kendi veri modeli vardır (model dediğimiz, farklı bir veritabanı olmadığı anlamına gelmez) ve kendi desen ve teknoloji bileşimi kullanılarak oluşturulur. Daha da önemlisi, iki katman, bu kılavuz için kullanılan örnekte (mikro hizmet sıralama) olduğu gibi aynı katman veya mikro hizmet içinde olabilir. Alternatif olarak, farklı mikro hizmetlere veya işlemlere uygulanarak, birbirleri etkilenmeden ayrı ayrı iyileştirilebilir ve ölçeklendirilebilirler.

CQRS, diğer bağlamlarda tek bir nesne kullanılan okuma/yazma işlemi için iki farklı nesneye sahip olma anlamına gelir. Normalleştirilmemiş bir okuma veritabanına sahip olmanın nedenleri vardır, daha gelişmiş CQRS literatüründe öğrenebileceğiniz. Ancak burada bu yaklaşımı kullanmıyoruz; burada amaç sorguları toplamalar gibi DDD desenlerinden kaynaklanan kısıtlamalarla sınırlamak yerine sorgularda daha fazla esnekliğe sahip olmaktır.

Bu tür bir hizmet örneği, eShopOnContainers başvuru uygulamasından mikro hizmet sipariş etmedir. Bu hizmet, basitleştirilmiş bir CQRS yaklaşımını temel alan bir mikro hizmet uygular. Şekil 7-2'de gösterildiği gibi tek bir veri kaynağı veya veritabanı kullanır, ancak işlem etki alanı için iki mantıksal model ve DDD desenleri kullanır.

Üst düzey Basitleştirilmiş CQRS ve DDD mikro hizmetini gösteren diyagram.

Şekil 7-2. Basitleştirilmiş CQRS ve DDD tabanlı mikro hizmet

Mantıksal "Sıralama" Mikro Hizmeti, Sıralama veritabanını içerir; bu veritabanı aynı Docker konağı olabilir, fakat olması gerekli değildir. Veritabanının aynı Docker ana bilgisayarında olması geliştirme için iyidir, ancak üretim için uygun değildir.

Uygulama katmanı Web API'sinin kendisi olabilir. Buradaki önemli tasarım yönü, mikro hizmetin sorguları ve ViewModel'leri (özellikle istemci uygulamaları için oluşturulan veri modelleri) CQRS desenini izleyen komutlardan, etki alanı modelinden ve işlemlerden ayırmasıdır. Bu yaklaşım, sorguları, sonraki bölümlerde açıklandığı gibi yalnızca işlemler ve güncellemeler için anlamlı olan DDD desenlerinden gelen kısıtlamalardan bağımsız tutar.

Ek kaynaklar