Bom pessoal, e agora eu quero falar com você sobre CQRS, Command Query Responsibility Segregation. Olha que nome top, hein galera? Para que serve essa parada e aonde o CQRS vai nos ajudar? A ideia do CQRS é bem simples, porém você não precisa utilizar CQRS em todos os aspectos. Você não precisa sair utilizando CQRS em todos os CRUDs, para fazer CRUD. Você vai entender como que CQRS consegue te ajudar. Vamos imaginar que eu tenho aqui a minha aplicação, ou seja, eu tenho a camada de apresentação, a aplicação, caiu no domínio, regras de negócio, bateu na infraestrutura, acessei banco de dados e etc. O que acontece aqui nesse momento? Se você perceber, vamos pensar um pouco sobre o que acontece quando a gente faz uma mudança no sistema. Vamos imaginar, eu criei um novo usuário. faz uma mudança no sistema. Vamos imaginar, eu criei um novo usuário. Acontece muito assim, né? Eu mando uma request para um HTTP, fiz um post, na hora que eu recebi um post eu crio o usuário, e daí eu até retorno ali um JSON com os dados do usuário criado com o ID. Se você perceber, essa minha requisição, ela está fazendo mais do que criar o usuário. Ela está mudando o meu banco de dados e também fazendo uma consulta para retornar os dados desse cara que foi criado. Agora, e se a gente tivesse uma forma de separar o que é leitura e o que é gravação Para facilitar a nossa vida em diversos momentos da nossa aplicação conforme as coisas foram crescendo Olha só que interessante aqui. Vamos imaginar que eu tenha uma camada de apresentação aqui. Quando eu tenho essa minha camada de apresentação, eu crio um lado da minha aplicação chamado de Command Stack. O que é Command Stack? É uma camada, é uma área da minha aplicação onde eu tenho apenas mudanças de estado na minha aplicação. Criei um usuário, alterei um e-mail, fiz um update ou alguma coisa. Ou seja, a minha intenção é de causar mutação, então eu estou na minha Command Stack. A minha apresentação recebe essa informação, baixa na minha na minha aplicação rodo regras de domínio acesso banco de dados e acabou nesse ponto se você perceber quando eu crio alguma coisa eu não vou retornar algo em troca então na hora que eu crio um comando eu apenas executo comando e acabou eu retorno void eu não sei nem se deu certo esse comando, eu apenas executo o comando e acabou. Eu retorno void. Eu não sei nem se deu certo esse comando. Se deu algo errado, o que eu vou fazer é retornar uma simples exception. Ok? Caso contrário, eu vou rodar o comando e acabou. Então, se eu criar um novo usuário, eu rodo e pronto. Acabou. Criei o usuário. Agora, como a pessoa vai pegar esse usuário, não tem nada a ver comigo, porque eu só gravo. Essa área do meu sistema, ela serve apenas para gravação. Legal? Agora, uma coisa interessante aqui que a gente tem que pensar é que eu tenho uma outra área do meu sistema que a query stack onde eu tenho apenas a minha aplicação se você perceber eu não tô nem passando pelo modelo de domínio porque porque se alguém quer os usuários eu não quero saber se o usuário tem que chamar um repositório para carregar um modelo de domínio, para eu retornar o meu agregado inteiro, nada disso. O cara quer receber os usuários, eu bato na minha aplicação, seleciono os usuários e retorno esse usuário e não interessa mais nada. Ou seja, eu posso pular regras de negócio eu posso fazer muita coisa porque isso pode me ajudar a gente tem que pensar galera que um sistema de forma geral se você tem a 10 mil visualizações é porque você teve por exemplo a mil escritas normalmente a visualização é muito mais forte com as do que é escrita normalmente não estou dizendo que isso é regra tá então o que acontece para eu conseguir deixar o meu sistema eventualmente mais performático mas também né evitar com que o meu sistema ele tem que ficar rodando regras de domínio ou qualquer coisa desse tipo, o que simplesmente eu posso fazer? Quando a pessoa quiser consultar, eu vou resolver o problema dela de consulta e acabou. Legal? Quando a pessoa quiser gravar, eu vou resolver a regra dela, passando pelas minhas regras de negócio, para fazer a gravação. Legal? Então, por exemplo, se eu for querer gerar um crediário, eu vou gerar, ele vai criar número de parcelas, vai fazer todas as regras malucas e difíceis. Tá? Agora, se eu quiser saber só as parcelas, eu não preciso acessar modelo de domínio. Eu pego as parcelas onde o usuário é tal e retorno para o cara, por exemplo. Uma facilidade muito maior então quando eu consigo separar essas responsabilidades eu tenho diversas vantagens uma eu consigo retornar os dados da forma mais fácil para o usuário eu consigo ter views materializadas para retornar tudo da forma mais fácil eu consigo ter mais performance para trabalhar dessa forma inclusive tá eu consigo deixar a parte com responsabilidade de um modelo de domínio somente numa parte da aplicação e pra falar a verdade não é tão difícil desenvolver uma aplicação utilizando o cqrs tá não é tão difícil tá mas é óbvio é você tem que mudar um pouco esse paradigma porque o seu comando ele só executa algo ele não retorna algo pra você legal agora uma coisa interessante aqui é que quando você está separando essa parte de escrita e da parte de leitura você também tem uma opção tá você também tem uma opção e essa opção é o seguinte você pode criar um banco de dados de escrita e um banco de dados de leitura olha só que interessante então o que acontece e um banco de dados de leitura. Olha só que interessante. Então, o que acontece? O meu banco de dados de escrita vai recebendo todas as gravações, o banco de dados de escrita sincroniza no banco de dados de leitura e a minha leitura acontece separada totalmente da minha escrita. Isso não é obrigatoriedade do CQRS, tá? Mas você pode fazer isso. Um outro ponto importante é que eu posso, por exemplo, fazer algumas coisas interessantes. Por exemplo, eu posso gravar num MySQL e fazer a minha leitura num Cassandra. Eu posso gravar num DynamoDB e retornar para fazer algumas leituras no Mongo. Não faria muito sentido, mas gravar no Mongo, ler no Dynamo ou qualquer coisa desse tipo. Ou seja, você pode fazer com que o seu banco de dados seja utilizado e otimizado pela para as operações que façam sentido né então eu vou pegar um banco de dados que é muito bom para a gravação eu vou pegar um banco de dados que eu consigo manipular muito bem a parte de leitura então com o cqrs eu consigo fazer esse tipo de coisa legal então é importante a gente entender quem criou tá essa pegada de cqrs tá um camarada chamado de greg yang gregory yang tá e tudo isso veio de uma idéia de um outro padrão que é chamado de cqs tá aqui é como de query separation que se não me engano é do Brayton Meyer, se eu não me engano. E o que que acontece? A ideia desse cara é eu conseguir fazer alguns tipos de separação, como eu falei pra você, né? Tudo que é ação não retorna nada, mas isso aí era algo muito mais de baixo nível, inclusive. O CQRS, ele olha isso de uma forma muito mais de baixo nível, inclusive. O CQRS, ele olha isso de uma forma muito mais de alto nível arquitetural do que necessariamente também dentro ali da aplicação. Então, é importante você saber que existe o CQS e o CQRS. Legal? Um grande abraço para você, tudo de bom, e até o nosso próximo vídeo.