---
# System prepended metadata

title: CQRS

---

# CQRS

Hoje temos os bancos todos separados, e precisavamos unificar eles para fazer joins.

Não temos campos customizados na pesquisa avançada. Com o CQRS vamos ter estes campos.

O Report consome o CQRS, para montarmos consultas com joins é utilizado o CQRS por baixo para montar as consultas.

O importação CSV vai consumir o CQRS.

O elasticSearch é um banco não relacional, que trabalha com indice e documentos, o **indice** é como se fosse as tabelas e os **documentos** são como se fosse as colunas.
Para acessar utilizamos o serviço do PRESTO para fazer a conexão e as consultas no elasticSearch.

### Consultando no elasticSearch

A consulta é feita dentro do container do PRESTO por linha de comando.

**Comandos:**
presto --catalog elasticsearch --schema default
show tables;

## Mensageria

A mensageria utiliza o serviço HERMOD.
A amazom aws (SNS e SQS) é o serviço que utilizamos para publicar e consumir eventos.

**SNS**
Topics:
Utilizamos o qabtb_service
Topicos são aonde nós publicamos os eventos (mensagem).
Quando um serviço utiliza um topico?
Quando é necessario publicar mensagens.

**SQS**
São as filas, fica monitorando os topicos.
Consigo ver quais tópicos as filas consomem.

**Entidades trabalhadas pelo CQRS são:**
* CUSTOMER
* LEAD
* CONTACT
* SALES ORDER
* PRODUCT
* ACTIVITY
* OPPORTUNITY
* OPPORTUNITY_ITEMS (não pronta)
* BTB (precisa somente para montar o contrato)

> O CQRS se basea totalmente no BTB como um contrato
> Meta-object são as tabelas (Indice)
> Meta-atribute são as colunas (Documentos)
> Customization-lake são os registros (Somente dos dados customizados)

### Exemplo prático:
Eu crio uma oportunidade e salvo (O registro e salvo na tabela opportunity);
A mesma ação de salvar acontece na tabela de message_broke_event (Isso se chama um evento) (sempre se lembre desta tabela)
Ela é publicada dentro do tópico do opportunity no SNS
E ai os serviços vão consumir conforme as filas (SQS), o que importa para nós é a fila do bragi.

### Criando um tópico (SNS) e uma fila (SQS)
Para criar um Topic (SNS)

Procure por SNS nos Services

![](https://i.imgur.com/o29dkAb.png)

Clique em Topic na sidebar a esquerda e em Create topic para cadastrar um tópico

![](https://i.imgur.com/yliIj18.png)

Marque a opção Standard preencha o Name conforme o padrão

![](https://i.imgur.com/ELBhPQu.png)

Depois clique em Create topic

![](https://i.imgur.com/6VbsFNc.png)

Após criar o Topic copie o ARN

![](https://i.imgur.com/x6VYRBQ.png)

Pronto agora o Topic foi criado, então vamos cadastar uma fila para ele:

Para isto abra uma nova aba, mas mantenha a aba do Topic aberta, com a AWS e procure nos Services por SQS

![](https://i.imgur.com/AdmVGEz.png)

Clique no botão Create queue

![](https://i.imgur.com/8BMI0hP.png)

Marque a opção Standard e preencha o campo Name conforme o padrão

![](https://i.imgur.com/yUX9QkN.png)

Clique em Create queue para finalizar o cadastro da fila

![](https://i.imgur.com/PqF7uuO.png)

Após ter cadastrado a fila, vamos escrever ela no Topic do SNS: Procure por ela pesquisando pelo nome no campo de pesquisa;
Quando encontrar, selecione ela clicando no radio button;
Clique na select Actions que fica ao lado do botão Create queue;
Clique na opção Subscribe to Amazon SNS topic;

![](https://i.imgur.com/nFTmp2E.png)

Agora na tela de Subscribe to Amazon SNS topic: 
Clique na select Specify an Amazon SNS topic available for this queue;
Selecione a opção Enter Amazon SNS topic ARN;

![](https://i.imgur.com/HgszPtw.png)

Vai abrir uma caixa de texto An Amazon SNS topic that can send notifications to an Amazon SQS queue:
Cole o ARN copiado após a criação do Topic;
Clique no botão Save;

![](https://i.imgur.com/N6Qitmr.png)

Após salvar a inscrição da fila no topic, vamos rolar a pagina para baixo até aparecer varias colunas com opções:
Clique na opção SNS subscriptions;
Marque o Topic que você criou anteriormente;
Clique em View SNS;

![](https://i.imgur.com/DkvYOfy.png)

Vamos ser redirecionados para o SNS em outra aba:
Nela vamos clicar em Edit;

![](https://i.imgur.com/U0ywTcV.png)

Após clicar em Edit na proxima tela vamos marcar a opção Enable raw message delivery;

![](https://i.imgur.com/17oaUMl.png)

Depois é só clicar em Save changes

![](https://i.imgur.com/lxpjq3B.png)



---

Para poder-mos monitorar as messages de uma fila podemos marcar a opção **Poll for messages** dentro da fila:

Para isto edite uma fila (SQS / QUEUE)

![](https://i.imgur.com/GWrfZJv.png)

No bloco Receive message marque a opção **Poll for message**

![](https://i.imgur.com/OnYqIyS.png)


## WarmUp

Serviço criado para atualizar bases que já contenha dados.

**Como fazer o processo:**

* Vamos no rancher
* Em Infraestrutura
* Dar um upgrade no elasticSearch (Caso não tenha mais de um tenant)
* Dar upgrade no PRESTO
* Dar um drop no tenant na base do BRAGI
* Criar o tenant novamente
* Vou na AWS no SQS nas filas QUEUES do qabtb_service
* Marco a fila que tem mensagem e dou um PURGE para deletar as mensagem da fila (!Atenção para não deletar as mensagens das filas que outras pessoas estão usando!)
* No caso de não poder deletar a fila, entrar dentro da fila, clico em send and receive messages, e clico em Poss for messages. Vou clicar na mensagem e ver se é do meu tenant, ai se for eu deleto.
* Após todo o processo de remoção das filas/message, rodar as migrations (flyway)
* Dar upgrade no container do BRAGI (Para iniciar o warmUp)
* Dar um view log para ver o processo

Existe um comando no postman para limpar todos os dados de um tenant no elastiSerch sem precisar reiniciar o container, caso aja mais de um tenant cadastrado no elasticSearch:
`<url>:9200/tenant_3_*`


> Não há suporte para update de um meta_object, portanto da erro no processamento do message-broker.
> Existe um parametro para configurar o numero de tentativas até falhar.

Para testar a collection (Ex: AWS - SNS/SQS (Customer) CR) onde valida o SQS e SNS
Foi criado uma stack QA-GoAWS no ambiente BTB
Foi criado databases separadas dos serviços que utilizam mensageria. Ex: opportunityaws
Esta utilizando o tenant_3
Antes de rodar a collection:
Preciso entrar na stack QA-GoAWS
Dar upgrated no container postgrest/postgrest:latest
Editar o parametro PGRST_DB_URI setando o banco do serviço que eu vou testar:

![](https://i.imgur.com/ncog7kL.png)
