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
- Command (Komutlar): Veri üzerinde değişiklik yapan işlemleri kapsar (Insert, Update, Delete).
- Query (Sorgular): Sadece veri okuma işlemlerini içerir.
- 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