2. CQRS (Command Query Responsibility Segregation) Mimarisi

26 Şubat 2025

Serinin 1. Yazısı : 1. Giriş: Geleneksel ve Modern Yazılım Mimarileri

Serinin 3. Yazısı : 3. Event Sourcing ile Veri Yönetimi

CQRS Nedir? Neden Kullanılır?

CQRS (Command Query Responsibility Segregation), okuma (Query) ve yazma (Command) işlemlerinin birbirinden ayrılması prensibine dayanır. Geleneksel CRUD (Create, Read, Update, Delete) yapılarında aynı veri modeli hem okuma hem de yazma işlemleri için kullanılır. Ancak CQRS, bu iki işlemi birbirinden ayırarak performans, ölçeklenebilirlik ve güvenlik açısından avantajlar sağlar.

Geleneksel CRUD ile CQRS’in Karşılaştırması

Özellik

CRUD

CQRS

Veri modeli

Okuma ve yazma için aynı model kullanılır

Okuma ve yazma için ayrı modeller kullanılır

Performans

Büyük ölçekli sistemlerde yavaşlayabilir

Okuma ve yazma optimizasyonu sağlar

Karmaşıklık

Daha basit

Daha karmaşık

Veri Tutarlılığı

ACID kurallarına bağlıdır

Eventual Consistency kullanabilir

CQRS’in Bileşenleri

  1. Command (Komutlar): Veri üzerinde değişiklik yapan işlemleri kapsar (Insert, Update, Delete).
  2. Query (Sorgular): Sadece veri okuma işlemlerini içerir.
  3. Event Sourcing ile Kullanımı: CQRS genellikle Event Sourcing ile entegre edilerek kullanılır. Her işlem bir “event” olarak kaydedilir ve sistemin geçmişi izlenebilir.

.NET Core ile CQRS Uygulaması

Aşağıdaki kod örneğinde, CQRS prensiplerini kullanarak bir ürün yönetim API’si geliştireceğiz.

Komut (Command) - Yeni Ürün Ekleme

public class CreateProductCommand : IRequest<int>
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}

public class CreateProductHandler : IRequestHandler<CreateProductCommand, int>
{
    private readonly IProductRepository _repository;
    public CreateProductHandler(IProductRepository repository)
    {
        _repository = repository;
    }
    public async Task<int> Handle(CreateProductCommand request, CancellationToken cancellationToken)
    {
        var product = new Product { Name = request.Name, Price = request.Price };
        return await _repository.AddProductAsync(product);
    }
}

Sorgu (Query) - Ürünleri Getirme

public class GetAllProductsQuery : IRequest<List<Product>> { }

public class GetAllProductsHandler : IRequestHandler<GetAllProductsQuery, List<Product>>
{
    private readonly IProductRepository _repository;
    public GetAllProductsHandler(IProductRepository repository)
    {
        _repository = repository;
    }
    public async Task<List<Product>> Handle(GetAllProductsQuery request, CancellationToken cancellationToken)
    {
        return await _repository.GetAllProductsAsync();
    }
}

Bir sonraki bölümde, Event Sourcing ile CQRS’in nasıl daha güçlü hale getirilebileceğini inceleyeceğiz. 🚀

 

Serinin 1. Yazısı : 1. Giriş: Geleneksel ve Modern Yazılım Mimarileri

Serinin 3. Yazısı : 3. Event Sourcing ile Veri Yönetimi

Yorumlar