Aplicar padrões CQRS e DDD simplificados em um microsserviçoApply simplified CQRS and DDD patterns in a microservice

O CQRS é um padrão de arquitetura que separa os modelos para ler e gravar dados.CQRS is an architectural pattern that separates the models for reading and writing data. O termo relacionado CQS (Separação de Comando-Consulta) foi originalmente definido por Bertrand Meyer em seu livro Object Oriented Software Construction (Construção de software orientada a objeto).The related term Command Query Separation (CQS) was originally defined by Bertrand Meyer in his book Object Oriented Software Construction. A ideia básica é que você pode dividir operações de um sistema em duas categorias nitidamente separadas:The basic idea is that you can divide a system’s operations into two sharply separated categories:

  • Consultas.Queries. Essas retornam um resultado, não alteram o estado do sistema e são livres de efeitos colaterais.These return a result and do not change the state of the system, and they are free of side effects.

  • Comandos.Commands. Esses alteram o estado de um sistema.These change the state of a system.

O CQS é um conceito simples — trata-se de métodos dentro do mesmo objeto sendo consultas ou comandos.CQS is a simple concept—it is about methods within the same object being either queries or commands. Cada método retorna um estado ou muda um estado, mas não ambos.Each method either returns state or mutates state, but not both. Até mesmo um único objeto de padrão de repositório pode estar em conformidade com o CQS.Even a single repository pattern object can comply with CQS. O CQS pode ser considerado um princípio fundamental para o CQRS.CQS can be considered a foundational principle for CQRS.

O CQRS (Segregação de Responsabilidade de Consulta e Comando) foi introduzido por Greg Young e altamente promovido por Udi Dahan e outros.Command and Query Responsibility Segregation (CQRS) was introduced by Greg Young and strongly promoted by Udi Dahan and others. Ele se baseia no princípio do CQS, embora seja mais detalhado.It is based on the CQS principle, although it is more detailed. Ele pode ser considerado um padrão com base em comandos e eventos, além de ser opcional em mensagens assíncronas.It can be considered a pattern based on commands and events plus optionally on asynchronous messages. Em muitos casos, o CQRS está relacionado a cenários mais avançados, como ter um banco de dados físico para leituras (consultas) diferente do banco de dados para gravações (atualizações).In many cases, CQRS is related to more advanced scenarios, like having a different physical database for reads (queries) than for writes (updates). Além disso, um sistema CQRS mais evoluído pode implementar ES (fonte de eventos) em seu banco de dados de atualizações. Assim, você deve apenas armazenar eventos no modelo de domínio, em vez de armazenar os dados do estado atual.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. No entanto, essa não é a abordagem usada neste guia; estamos usando a abordagem mais simples de CQRS, que consiste em separar apenas as consultas dos comandos.However, this is not the approach used in this guide; we are using the simplest CQRS approach, which consists of just separating the queries from the commands.

O aspecto de separação do CQRS é obtido pelo agrupamento de operações de consulta em uma camada e comandos em outra camada.The separation aspect of CQRS is achieved by grouping query operations in one layer and commands in another layer. Cada camada tem seu próprio modelo de dados (observe que dizemos modelo, não necessariamente um banco de dados diferente) e é criada usando sua própria combinação de padrões e tecnologias.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. Além disso, as duas camadas podem estar dentro do mesmo nível ou microsserviço, como no exemplo (microsserviço de ordenação) usado para este guia.More importantly, the two layers can be within the same tier or microservice, as in the example (ordering microservice) used for this guide. Ou elas podem ser implementadas em diferentes microsserviços ou processos para que possam ser otimizadas e expandidas separadamente sem afetar umas às outras.Or they could be implemented on different microservices or processes so they can be optimized and scaled out separately without affecting one another.

CQRS significa ter dois objetos para uma operação de leitura/gravação, em que, em outros, há um.CQRS means having two objects for a read/write operation where in other contexts there is one. Há motivos para ter um banco de dados de leitura desnormalizado, sobre o qual você pode aprender na literatura sobre CQRS mais avançada.There are reasons to have a denormalized reads database, which you can learn about in more advanced CQRS literature. Mas não estamos usando essa abordagem aqui, em que a meta é ter mais flexibilidade nas consultas, em vez de limitá-las com restrições de padrões DDD como agregações.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.

Um exemplo desse tipo de serviço é o microsserviço de ordenação do aplicativo eShopOnContainers de referência.An example of this kind of service is the ordering microservice from the eShopOnContainers reference application. Este serviço implementa um microsserviço com base em uma abordagem CQRS simplificada.This service implements a microservice based on a simplified CQRS approach. Ele usa uma única fonte de dados ou banco de dados, mas dois modelos lógicos, além de padrões DDD para o domínio transacional, conforme mostrado na Figura 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.

Diagrama mostrando um microserviço do CQRS e do DDD de alto nível simplificado.

Figura 7-2.Figure 7-2. Microsserviço baseado em CQRS e DDD simplificadoSimplified CQRS- and DDD-based microservice

O microserviço "ordenando" lógico inclui seu banco de dados de ordenação, que pode ser, mas não precisa ser, o mesmo host do Docker.The Logical "Ordering" Microservice includes its Ordering database, which can be, but doesn't have to be, the same Docker host. É bom ter o banco de dados no mesmo host do Docker para desenvolvimento, mas não para produção.Having the database in the same Docker host is good for development, but not for production.

A camada de aplicativo pode ser a própria API Web.The application layer can be the Web API itself. O aspecto de design importante aqui é que o microsserviço dividiu as consultas e ViewModels (modelos de dados criados especialmente para os aplicativos cliente) dos comandos, do modelo de domínio e das transações que seguem o padrão 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. Essa abordagem mantém as consultas independentes de restrições provenientes de padrões DDD que só fazem sentido para transações e atualizações, conforme explicado nas seções posteriores.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.

Recursos adicionaisAdditional resources

  • Greg Young. Controle de versão em um sistema de origem de eventos (gratuito para ler o livro eletrônico online) Greg Young. Versioning in an Event Sourced System (Free to read online e-book)
    https://leanpub.com/esversioning/read