Architekt systemówInżynier backend

Czym jest CQRS (Command Query Responsibility Segregation) i po co go stosować?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

CQRS to wzorzec separacji odpowiedzialności pomiędzy komendami (Commands) a zapytaniami (Queries). Komenda zmienia stan systemu, a zapytanie tylko odczytuje dane. Najczęściej dla tych zadań projektuje się różne modele danych i oddzielne interfejsy.

Zaleta CQRS: pozwala zoptymalizować procesy dostępu do danych dla odczytu i zapisu osobno, co zwiększa wydajność złożonych systemów, ułatwia skalowanie i optymalizację pod różne scenariusze obciążenia.

Przykład kodu (CQRS z użyciem 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) { // Wprowadzanie zmian w DB } } class OrderQueryHandler { public Order Handle(GetOrderQuery query) { // Odczyt danych z DB bez zmian return new Order(); } }

Kluczowe cechy:

  • Oddziela operacje modyfikacji stanu od operacji odczytu
  • Pozwala zoptymalizować przechowywanie i przetwarzanie każdej z części osobno
  • Wzmacnia spójność i bezpieczeństwo architektury, szczególnie przy wysokim obciążeniu

Pytania z pułapką.

Czy CQRS jest wersją CRUD podzieloną na dwie klasy?

Nie, CQRS to więcej niż tylko rozdzielenie metod. Zwykle tworzone są oddzielne modele, struktury danych i interfejsy dla części odczytowej i komendowej, często stosowane są różne bazy danych.

Czy CQRS pasuje do wszystkich projektów?

Nie. Wdrożenie CQRS ma sens tylko w przypadku złożonych, skalowalnych systemów z wysokimi wymaganiami wydajnościowymi i niezależności przetwarzania. Dla małych projektów często jest to zbędne.

Czy CQRS jest gwarancją eventual consistency (końcowej spójności)?

Nie koniecznie. CQRS może być realizowane z eventual consistency w systemach rozproszonych, ale sam wzorzec nie daje tej gwarancji.