Stosowanie uproszczonych wzorców CQRS i DDD w mikrousługachApply simplified CQRS and DDD patterns in a microservice

CQRS jest wzorcem architektury, który oddziela modele do odczytu i zapisu danych.CQRS is an architectural pattern that separates the models for reading and writing data. Powiązany termin Command Query Separation (CQS) został pierwotnie zdefiniowany przez Bertranda Meyera w swojej książce Object Oriented Software Construction.The related term Command Query Separation (CQS) was originally defined by Bertrand Meyer in his book Object Oriented Software Construction. Podstawową ideą jest to, że można podzielić operacje systemu na dwie kategorie ostro oddzielone:The basic idea is that you can divide a system's operations into two sharply separated categories:

  • Kwerendy.Queries. Te zwracają wynik i nie zmieniają stanu systemu, i są wolne od skutków ubocznych.These return a result and do not change the state of the system, and they are free of side effects.

  • Polecenia.Commands. Zmieniają one stan systemu.These change the state of a system.

CQS jest prosta koncepcja: chodzi o metody w tym samym obiekcie są kwerendy lub polecenia.CQS is a simple concept: it is about methods within the same object being either queries or commands. Każda metoda zwraca stan lub mutuje stan, ale nie oba.Each method either returns state or mutates state, but not both. Nawet pojedynczy obiekt wzorca repozytorium może być zgodny z CQS.Even a single repository pattern object can comply with CQS. CQS można uznać za podstawową zasadę dla CQRS.CQS can be considered a foundational principle for CQRS.

Command and Query Responsibility Segregation (CQRS) został wprowadzony przez Grega Younga i silnie promowany przez Udi Dahan i innych.Command and Query Responsibility Segregation (CQRS) was introduced by Greg Young and strongly promoted by Udi Dahan and others. Opiera się na zasadzie CQS, chociaż jest bardziej szczegółowa.It is based on the CQS principle, although it is more detailed. Można uznać wzorzec na podstawie poleceń i zdarzeń oraz opcjonalnie na komunikaty asynchroniczne.It can be considered a pattern based on commands and events plus optionally on asynchronous messages. W wielu przypadkach CQRS jest związane z bardziej zaawansowanych scenariuszy, takich jak o innej fizycznej bazy danych dla odczytów (kwerend) niż dla zapisów (aktualizacje).In many cases, CQRS is related to more advanced scenarios, like having a different physical database for reads (queries) than for writes (updates). Ponadto bardziej rozwinięty system CQRS może implementować usługi event-sourcing (ES) dla bazy danych aktualizacji, więc zdarzenia będą przechowywane tylko w modelu domeny zamiast przechowywania bieżących danych o stanie.Moreover, a more evolved CQRS system might implement Event-Sourcing (ES) for your updates database, so you would only store events in the domain model instead of storing the current-state data. Jednak to podejście nie jest używane w tym przewodniku.However, this approach is not used in this guide. W tym przewodniku użyto najprostszego podejścia CQRS, które polega tylko na oddzieleniu zapytań od poleceń.This guide uses the simplest CQRS approach, which consists of just separating the queries from the commands.

Aspekt separacji CQRS jest osiągany przez grupowanie operacji kwerendy w jednej warstwie i poleceń w innej warstwie.The separation aspect of CQRS is achieved by grouping query operations in one layer and commands in another layer. Każda warstwa ma swój własny model danych (należy pamiętać, że mówimy modelu, niekoniecznie innej bazy danych) i jest zbudowany przy użyciu własnej kombinacji wzorców i technologii.Each layer has its own data model (note that we say model, not necessarily a different database) and is built using its own combination of patterns and technologies. Co ważniejsze, dwie warstwy mogą znajdować się w tej samej warstwie lub mikrousługach, jak w przykładzie (zamawianie mikrousług) używane dla tego przewodnika.More importantly, the two layers can be within the same tier or microservice, as in the example (ordering microservice) used for this guide. Lub mogą być implementowane na różnych mikrousług lub procesów, dzięki czemu mogą być optymalizowane i skalowane w poziomie oddzielnie bez wpływu na siebie nawzajem.Or they could be implemented on different microservices or processes so they can be optimized and scaled out separately without affecting one another.

CQRS oznacza posiadanie dwóch obiektów dla operacji odczytu/zapisu, gdzie w innych kontekstach istnieje jeden.CQRS means having two objects for a read/write operation where in other contexts there is one. Istnieją powody, aby mieć zdenormalizowane odczyty bazy danych, które można dowiedzieć się o bardziej zaawansowanej literatury CQRS.There are reasons to have a denormalized reads database, which you can learn about in more advanced CQRS literature. Ale nie używamy tego podejścia w tym miejscu, gdzie celem jest mieć większą elastyczność w kwerendach zamiast ograniczania zapytań z ograniczeniami z wzorców DDD, takich jak agregacje.But we are not using that approach here, where the goal is to have more flexibility in the queries instead of limiting the queries with constraints from DDD patterns like aggregates.

Przykładem tego rodzaju usługi jest zamawiania mikrousługi z aplikacji referencyjnej eShopOnContainers.An example of this kind of service is the ordering microservice from the eShopOnContainers reference application. Ta usługa implementuje mikrousługi na podstawie uproszczonego podejścia CQRS.This service implements a microservice based on a simplified CQRS approach. Używa jednego źródła danych lub bazy danych, ale dwa modele logiczne plus wzorce DDD dla domeny transakcyjnej, jak pokazano na rysunku 7-2.It uses a single data source or database, but two logical models plus DDD patterns for the transactional domain, as shown in Figure 7-2.

Diagram przedstawiający mikrousługi uproszczone CQRS i DDD na wysokim poziomie.

Rysunek 7-2.Figure 7-2. Uproszczona mikrousługa oparta na CQRS i DDDSimplified CQRS- and DDD-based microservice

Logiczne "Zamawianie" Mikrousługa zawiera jego zamawiania bazy danych, które mogą być, ale nie musi być, tego samego hosta platformy Docker.The Logical "Ordering" Microservice includes its Ordering database, which can be, but doesn't have to be, the same Docker host. Posiadanie bazy danych w tym samym hoście platformy Docker jest dobre dla rozwoju, ale nie dla produkcji.Having the database in the same Docker host is good for development, but not for production.

Warstwą aplikacji może być sam internetowy interfejs API.The application layer can be the Web API itself. Ważnym aspektem projektu w tym miejscu jest, że mikrousługa ma podzielić zapytania i ViewModels (modele danych specjalnie utworzone dla aplikacji klienckich) z poleceń, modelu domeny i transakcji po wzorzec CQRS.The important design aspect here is that the microservice has split the queries and ViewModels (data models especially created for the client applications) from the commands, domain model, and transactions following the CQRS pattern. Takie podejście utrzymuje zapytania niezależne od ograniczeń i ograniczeń pochodzących z wzorców DDD, które mają sens tylko dla transakcji i aktualizacji, jak wyjaśniono w późniejszych sekcjach.This approach keeps the queries independent from restrictions and constraints coming from DDD patterns that only make sense for transactions and updates, as explained in later sections.

Zasoby dodatkoweAdditional resources

  • Greg Young. Przechowywanie wersji w systemie event sourced (free to read online e-book) Greg Young. Versioning in an Event Sourced System (Free to read online e-book)
    https://leanpub.com/esversioning/read