Aracılığıyla paylaş


Mikro hizmette basitleştirilmiş CQRS ve DDD desenleri 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.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

CQRS, verileri okuma ve yazma modellerini ayıran bir mimari desendir. İlgili Command Query Separation (CQS) terimi ilk olarak Bertrand Meyer tarafından Object-Oriented Software Construction 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 durum döndürür veya durumu sessize alır, ancak ikisini birden döndürmez. 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. Komutlara ve olaylara ve isteğe bağlı olarak zaman uyumsuz iletilere dayalı 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 Olay Kaynağını Belirleme (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, okuma/yazma işlemi için diğer bağlamlarda bir nesnenin bulunduğu iki nesneye sahip olmak anlamına gelir. Daha gelişmiş CQRS literatüründe öğrenebileceğiniz, normalleştirilmiş bir okuma veritabanı olmasının nedenleri vardır. 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.

Diagram showing a high level Simplified CQRS and DDD microservice.

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

Mantıksal "Sıralama" Mikro hizmeti, aynı Docker konağı olabilecek ancak olması gerekmeyen Sıralama veritabanını içerir. 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üncelleştirmeler için anlamlı olan DDD desenlerinden gelen kısıtlamalardan ve kısıtlamalardan bağımsız tutar.

Ek kaynaklar