CQRS Nedir?
CQRS (Command Query Responsibility Segregation), bir yazılım tasarım desenidir ve bir uygulamanın yazma (command) ve okuma (query) işlemlerini farklı modeller ve yöntemlerle ele alır. Bu desen, uygulamanın veri modelini iki ayrı model haline getirir: biri yazma işlemleri için, diğeri okuma işlemleri için.
CQRS deseni özellikle büyük ve karmaşık uygulamalarda kullanılır. Bu desen, yazma ve okuma işlemleri arasındaki etkileşimleri basitleştirir, ölçeklenebilirliği arttırır ve uygulamanın performansını arttırır. Ayrıca, CQRS deseni, Domain Driven Design (DDD) ve Event Sourcing gibi diğer yazılım tasarım desenleriyle de sıklıkla kullanılır.
Örneğin, bir banka uygulamasında CQRS deseni kullanabiliriz. Öncelikle, “Commands” adı verilen bir model oluşturulur. Bu model, hesapta gerçekleştirilecek yazma işlemleri için kullanılır. Örneğin, para yatırma veya para çekme işlemleri için DepositCommand ve WithdrawalCommand modelleri oluşturulabilir.
Daha sonra, “Queries” adı verilen ayrı bir model oluşturulur. Bu model, hesap bilgilerini almak için kullanılır. Örneğin, hesap bakiyesini sorgulama işlemi için AccountBalanceQuery modeli oluşturulabilir.
Örneğin, bir kullanıcının hesap bilgilerini almak için şöyle bir kod kullanabiliriz:
var query =
new AccountBalanceQuery {
AccountId = accountId
};
var accountBalance = accountQueryService.GetAccountBalance(query);
Yine aynı şekilde, bir kullanıcının hesabına para yatırmak için şöyle bir kod kullanabiliriz:
var command =
new DepositCommand {
AccountId = accountId,
Amount = amount
};
accountCommandService.Deposit(command);
Yazma ve okuma işlemleri farklı hizmetlerle ele alınır. Örneğin, IAccountCommandService ve IAccountQueryService gibi ayrı hizmetler oluşturulabilir. Bu hizmetler, uygulamanın yazma işlemlerini ve okuma işlemlerini farklı birimlerde ele alabilir. Bu şekilde, ölçeklenebilirliği arttırılır ve performans optimize edilir.
Biraz daha farklı bir şekilde örneklendirmek gerekirse;
Deposit, Para Çekme ve Transfer işlemleri için birer command oluşturalım.
public class DepositCommand
{
public Guid AccountId { get; set; }
public decimal Amount { get; set; }
}
public class WithdrawalCommand
{
public Guid AccountId { get; set; }
public decimal Amount { get; set; }
}
public class TransferCommand
{
public Guid FromAccountId { get; set; }
public Guid ToAccountId { get; set; }
public decimal Amount { get; set; }
}
Hesap detayları ve hesap haraketlerini sorgulamak için bir query model
oluşturalım.
public class AccountDetailsQuery
{
public Guid AccountId { get; set; }
}
public class AccountTransactionsQuery
{
public Guid AccountId { get; set; }
}
Deposit işlemini gerçekleştiren bir command service
örneği oluşturalım.
public class DepositCommandService : IDepositCommandService
{
public void Deposit(DepositCommand command)
{
// TODO: hesap bakiyesini artırma işlemini gerçekleştir
}
}
Hesap detayları sorgusunu gerçekleştiren bir query service
örneği
public class AccountDetailsService : IAccountDetailsService
{
public AccountDetailsQueryResult GetAccountDetails(AccountDetailsQuery query)
{
// TODO: veritabanından hesap detaylarını sorgula ve sonucu döndür
}
}
Transfer işlemini gerçekleştirmek için bir command service
örneği
public class TransferCommandService : ITransferCommandService
{
public void Transfer(TransferCommand command)
{
// TODO: kaynak hesaptan hedef hesaba belirtilen miktarı aktar
}
}
Hesap haraketleri sorgusu için bir query service
örneği
public class AccountTransactionsService : IAccountTransactionsService
{
public AccountTransactionsQueryResult GetAccountTransactions(AccountTransactionsQuery query)
{
// TODO: veritabanından hesap işlemlerini sorgula ve sonucu döndür
}
}
Bu kod örnekleri, bir banka hesabı uygulamasının yazma (command) ve okuma (query) işlemlerinin nasıl ayrı modeller ve servisler aracılığıyla ele alınabileceğini göstermektedir. Tabii ki, bu sadece basit bir örnek ve gerçek dünyada CQRS deseninin uygulanması çok daha karmaşık olabilir. Ancak, bu örnekler temel fikri anlamak için yararlı olabilir.
Yorumlar