CQRS is een patroon dat de verantwoordelijkheid scheidt tussen commando's (Commands) en queries (Queries). Een commando verandert de toestand van het systeem, terwijl een query alleen gegevens leest. Vaak worden voor deze taken verschillende datamodellen en aparte interfaces ontworpen.
Voordeel van CQRS: het maakt het mogelijk om de processen voor het lezen en schrijven van gegevens apart te optimaliseren, wat de prestaties van complexe systemen verbetert, het schalen vergemakkelijkt en optimalisatie voor verschillende belastingscenario's mogelijk maakt.
Voorbeeldcode (CQRS met C#):
interface ICommand { } interface IQuery<TResult> { } class CreateOrderCommand : ICommand { public int OrderId { get; set; } } class GetOrderQuery : IQuery<Order> { public int OrderId { get; set; } } class OrderCommandHandler { public void Handle(CreateOrderCommand command) { // Wijzigingen in de DB aanbrengen } } class OrderQueryHandler { public Order Handle(GetOrderQuery query) { // Gegevens lezen uit de DB zonder wijzigingen return new Order(); } }
Belangrijkste kenmerken:
Is CQRS een versie van CRUD, gesplitst in twee klassen?
Nee, CQRS is meer dan alleen het scheiden van methoden. Gewoonlijk worden aparte modellen, datastructuren en interfaces voor de lezing en de commandokant gecreëerd, vaak worden verschillende databases gebruikt.
Is CQRS geschikt voor alle projecten?
Nee. De implementatie van CQRS is alleen zinvol voor complexe, schaalbare systemen met hoge prestatie-eisen en onafhankelijkheid in de verwerking. Voor kleine projecten is dit vaak overkill.
Biedt CQRS een garantie voor eventual consistency (uiteindelijke consistentie)?
Niet per se. CQRS kan worden geïmplementeerd met eventual consistency in gedistribueerde systemen, maar het patroon zelf biedt deze garantie niet.