[Música] Olá tudo bem seja muito bem-vindo ao quinto e último dia da imersão full stack full pych meu nome é Wesley e hoje é o dia em que a gente vai consolidar tudo que a gente construiu até agora no nosso projeto prático logo se você não assistiu aos vídeos vídeos anteriores volte e os assista enquanto ainda dá tempo nos dias de hoje uma das maiores dificuldades que muitos desenvolvedores Enfrentam e que podem impedir o progresso em grandes projetos ou empresas é não conseguir compreender um ecosistema como um todo muitas vezes o desenvolvedor conhece Apenas o
projeto que ele tá trabalhando mas em grandes corporações normalmente esse projeto é apenas uma parte de algo muito maior composto aí por diversos sistemas que precisam estar conectados e funcionando de forma conjunta saber estruturar essas partes e garantir que elas sejam Totalmente Integradas é Um Desafio que exige aí fundamentos sólidos experiência aí com ambientes distribuídos e muita familiaridade com tecnologias modernas com tantas opções e termos no mercado como arquitetura de software arquitetura de solução devops sre containers docker kubernetes c cd é é bem fácil a gente se sentir perdido por isso estudar e evoluir constantemente
é essencial para continuar relevante no mercado não há outro caminho ou você se atualiza e Cresce ou acaba ficando para trás aos pouquinhos aí e é exatamente essa é a missão da fsai conseguir acompanhar o seu crescimento profissional em cada etapa aí da sua carreira agora aproveitando que Eu mencionei agora a pouco aí contêiners eu quero falar o que que a gente vai fazer nesse último dia de projeto hoje o nosso objetivo é unificar todos os sistemas que a gente desenvolveu até agora garantindo que eles funcionem em conjunto para entregar O resultado final esperado o
nosso home broker totalmente funcional e integrado vamos utilizar o docker para integrar todos os serviços em um único ambiente configurado na agenda de hoje a gente vai concluir os ajustes finais do sistema desenvolvido em go finalizar em integração do cafca com o nestjs e por fim configurar todo o ambiente com todos os sistemas interligados e operando aí de maneira totalmente integrada antes de irmos pra tela do meu computador eu Quero deixar um recado aqui mais do que especial em breve a gente vai abrir novas matrículas pro curso fusy 4.0 que foi desenhado para capacitar e
desenvolvedores a criarem aplicações de grande porte nas maiores empresas do mercado esse curso ele vai te colocar em contato com as tecnologias mais modernas e amplamente utilizadas pelas grandes organizações preparando você para os desafios reais do dia a dia e eu trabalho com tecnologia desde 98 eu Venho de um tempo aonde os não existiam padrões de engenharia eram algo assim que a gente aprendia na faculdade teste era a última coisa que se fazia parte também de infraestrutura que é uma coisa que eu sempre tive muito dificuldade né parte do devops não é uma coisa tão
simples você não vê isso em qualquer curso Então assim eu eu eu já sofri bastante eu já passei alguma dificuldade e eu não aprendi na faculdade que eu venho de uma escola antiga então tudo Que eu vejo pela frente não segue o padrão do mercado hoje e o curso full cycle inicialmente eu achei que não era para mim porque ele é muito completo tá né o es já conheço eu sei que ele é um ponto fora da curva né porque ele é uma pessoaa assim extremamente estudiosa ele se prepara mesmo eh todas toda essa metodologia
de ensino e eu me interessei muito pelo conteúdo eu e as aulas assim que eu posso falar que tá muito acima do que eu esperava da minha expectativa Qualidade das aulas eles te levam a você ter mais vontade de estudar então assim você acaba não sofrendo naquele curso sofrível que você começa e Nunca Termina porque a gente que é de t a gente tem milhões de cursos comprados e nenhum terminado porque a gente não consegue chegar no fim acaba que aquilo fica maçante e você não tem vontade de continuar que é o contrário desse curso
que eu tô fazendo eu tô achando ele maravilhoso porque todo dia tem novidade Todo dia é uma é uma coisa nova no meio do caminho tem uma entrega tem um exercício alguma coisa que você tá ali testando que você tá aprendendo então ele não é um curso que te deixa solto é um curso que te prende tá então a metodologia é muito bacana ele tem uma evolução sabe é muito conhecimento então eh ele te abre portas assim para para um futuro muito promissor vai de você querer eu tô muitos anos numa empresa eu me sinto
Tranquilo lá mas eu tenho Lógico vontade de repente se eh aconteceu alguma coisa ou eu decidi que realmente eu quero sair eu tô preparado Praticamente tudo que eu preciso aqui sabe no curso eu fiquei bem feliz assim porque vem toda a parte de desenvolvimento né que é a parte do do arquiteto tirar o melhor proveito desse curso aí porque ele tá sendo muito bom para mim eu acho que ele é um curso que ele não é um curso não é um não é um valor é um investimento que assim eh se A gente colocar em
um valor Val de uma mensalidade de uma faculdade por exemplo é é irrisório é o preço eu eu parcelei por exemplo se eu for hoje no posto de combustível vai meu carro vai sair mais caro que o valor da parcela então assim pelo tanto de conteúdo pelo valor agregado do conhecimento Ele é super barato porque esse retorno vem muito rápido se você que é desenvolvedor né Pensa em de repente dar uma guinada de verdade né em matéria de conhecimento e Começar a entender realmente como as grandes empresas trabalham eu acho que esse é o curso
de verdade agora chegou a hora de colocarmos a mão na massa e finalizarmos o nosso projeto Bora integrar tudo e garantir que tudo fique funcionando direitinho vamos lá bom pessoal chegou a hora da gente colocar a mão na massa e o nosso objetivo hoje é muito claro terminar o nosso programa em go e fazer com que Esse programa ele seja totalmente integrável com o sistema que o Luiz tá desenvolvendo aí usando nest o Next e tudo mais então a gente vai ter essas duas partes o a finalização desse meu projeto e a integração desse projeto
com a parte do luí Carlos tá E para isso né a ponte dessas integrações elas vão acontecer através do apach cafca que no final das contas ele é um sistema de stream de dados é um sistema que ajuda um sistemas se comunicarem através dele Então Basic ente a gente tem aqui algo que a gente chama de broker do apach Cica tá Ah e esse broker aqui no final das contas ele tem algo que a gente chama de tópicos o que que é tópicos é como se fosse um canal tá é como se um tópico ele
fosse um canal de envio e recebimento de informações para que sistemas possam se plugar né para conseguir pegar essas informações ou enviar as informações tá então eu vou Dar um exemplo aqui para você vamos imaginar que eu tenho um canal aqui chamado orders tá ou seja onde vão ter a gente os os nossos pedidos de ordem de compra e venda tá então o que que acontece aqui eu posso ter aqui nesse meu caso o sistema por exemplo do luí Carlos tá nesse caso onde ele vai enviar né ele vai ter aqui no final das contas
né a os pedidos né de compra e venda Então vou colocar aqui pedidos de compra e venda tá então eu tenho esse Microsserviço aqui do luí Carlos com pedido de compra e venda basicamente é isso que a gente tem aqui tá Então vamos colocar esse camarada aqui vou diminuir um pouco a fonte somente para você entender melhor esse sistema aqui basicamente é o backend do Luiz com o nestjs Então a gente tem aqui o nestjs entrando a nessa parada então o que que vai acontecer toda vez que o nestjs receber um novo pedido de compra
ou venda de um ativo simplesmente ele vai Enviar esse pedido para onde para um tópico do apach cfca o que que vai acontecer esse pedido Ele vai ficar armazenado aqui dentro desse tópico tá então aqui eu vou chamar isso aqui de tópico somente para a gente acertar as nomenclaturas e esse tópico aqui ele vai armazenar essa mensagem tá então por exemplo o o meu System in que vai est na outra ponta Vamos colocar aqui ó meu System in né onde processa as ordens né vou colocar processa as ordens né o Nosso microsserviço de processar as
ordens e esse cara aqui é feito em go né somente pra gente lembrar sistema feito em go o que que vai acontecer aqui nesse momento no final das contas esse nosso sistem ele vai receber esse pedido faz Endo o quê pegando esses dados aqui do apach cfca é basicamente isso que vai acontecer aí quando nós sistema processar essa ordem a gente vai ter que retornar esse resultado pro sistema do Luiz por quê Porque o sistema do Luiz Tem que poder registrar essa informação e inclusive fazer né a alteração no frontend das ordens aparecendo as carteiras
e tudo mais então esses sistemas estão integrados nesse momento e é por isso que você desenvolvedor Hoje não tem que Focar apenas em saber programar você tem que entender como o sistema se integram Como você consegue trabalhar com grandes aplicações ainda mais nesse momento onde Inteligência Artificial Ah faz com que o código seja Gerado muito fácil né o nosso próximo grande diferencial na realidade o nosso atual grande diferencial no mercado é entender esses tipos de conceito e fazer com que essas implementações funcionem e não mais apenas a nossa a capacidade de gerar código tá para
isso a gente tem que se tornar realmente um desenvolvedor insubstituível como que a gente consegue ter esse perfil simplesmente entendendo como a gente gruda ecossistemas como a gente arquiteta sistemas como que a Gente consegue olhar para um código e ter senso crítico do que aquilo tá fazendo se eu consigo fazer uma boa review se eu consigo garantir que aquilo tem qualidade e nesse momento aqui é o que a gente tenta fazer nessa imersão da forma mais clara possível e da forma obviamente simplificada né ó a gente não consegue trazer tudo ah de uma vez senão
a gente ficaria aí meses criando um projeto como esse Mas voltando aqui galera esse nosso programa in ele vai Processar as ordens e a gente pode ter um outro tópico aqui por exemplo de ordens processadas tá ordens processadas e o que que isso simplesmente vai acontecer quando o go terminar de processar ele vai enviar a ordem processada para cá E aí o que que vai acontecer o sistema aqui do Luiz do nest JS ele vai fazer o quê ele vai pegar essa ordem processada e trabalhar aqui o interessante de tudo isso galera é que por
exemplo se esse sistema do go Sair do ar vou imaginar ficou fora do ar esse sistema o que que vai acontecer não tem problema entre aspas tá Por que que eu digo isso porque as mensagens as ordens que a gente tá recebendo elas estão gravadas aqui e isso faz com que a gente tenha algo que a gente chama de resiliência mesmo que um sistema caia a gente não perde né a capacidade de sair executando partes do nosso ecossistema ou seja o Luiz conseguiria ainda continuar mandando Novas ordens aí de pedidos e essas ordens elas vão
sendo enfileiradas e organizadas para que elas mantenham uma uma ordem de chegada aí no nosso caso e a mesma coisa é aqui né se o sistema do Luiz cí esse meu projeto aqui em go ele Continua trabalhando da mesma forma tá então por isso que trabalhar com Brokers intermediários nos ajudam bastante a fazer isso então o nosso objetivo aqui hoje é fazer essa integração então para o código go a gente vai fazer essa Integração com a pasa Cica e depois em seguida o luí vai fazer a integração com a pche CFC botando tudo funcionando beleza
então vamos aqui para nosso gol né pra nossa aplicação aqui a gente tem o Core da nossa aplicação o que a gente precisa agora aqui é fazer o seguinte nós termos uma forma de a gente conseguir se conectar com a p Cica para isso eu vou criar aqui dentro uma pastinha de infraestrutura Porque vão ser bibliotecas nesse caso né simples Pra gente fazer comunicação externa do nosso sistema então tô chamando aqui isso de infraestrutura ah a gente poderia colocar qualquer nome aqui que representasse isso de forma geral tá então eu vou aqui dentro de infra
eu vou criar aqui né ah um consumer tá pon go esse consumer e para não ficar muito coisado eu vou chamar criar isso aqui dentro de infra chamada icfc Aqui Dentro tá só pra gente saber do que se trata Então dentro desse Meu consumer pgo eu vou ter o meu package chamado de cafc tá E para isso para que esse meu package né Essa minha biblioteca ela funcione vamos dizer assim bem o que que eu vou fazer no final das contas eu vou trabalhar com uma biblioteca que o apach Cica Ah tem para Gol tá
que é mantida pela confluent que inclusive é a empresa que mantém o projeto do apach cfca tá então a biblioteca aqui é chamada de confluent cica go basicamente aqui é O endereço dela e quando eu tô colocando esse Import da essa dependência eu tô colocando aqui cafca por gerar um apelido Para não misturar com o meu package cafca senão a gente poderia ter um conflito de nome tá então essa que é a ideia aqui a gente criar tá um alas um apelido para essa biblioteca que a gente vai usar e aí nesse caso aqui o
que que nós vamos fazer nós vamos fazer um consumidor ou seja uma aplicação né uma biblioteca que a Gente consegue consumir os dados do apach CFC de uma forma mais simplificada tá então eu tô fazendo o seguinte eu tenho Type consumer e o consumer aqui no no a paste Cica a gente sempre tem algo que a gente chama de config map Tá o que que um config map é no final das contas ele é a um local onde a gente passa todas as opções de configuração que o cfca precisa e aqui também eu vou criar
um um outro camarada chamado de topics Que vai ser um slce de string Ou seja eu vou ter quais os tópicos que eu quero por exemplo consumir ficar escutando para eu receber as mensagens dele e agora vou utilizar né E aqui para me ajudar pelo menos para esse code completion aqui nesse momento para eu conseguir ah trabalhar tá então esse aqui é um ponto que eu acabei de fazer agora Como que eu consigo consumir essa mensagem aqui que tá o grande ponto nós vamos criar tá um método chamado consume Onde nós vamos receber uma mensagem
tá Ah de um canal que a gente vai trabalhar lembra que a gente criou canais inclusive aqui no nosso book onde a gente tem ordens chegando e ordens saindo eu vou criar um canal de mensagens para eu ficar recebendo essas informações do apach CFC então eu vou mostrar para vocês vai começar a fazer sentido aqui tá então vou colocar aqui consumer vou colocar aqui consume e nesse consume aqui eu vou Colocar assim ó msg Chen que vai ser um canal de CF message aqui para mim e um error ele vai poder retornar tá então o
que que isso significa nesse momento pessoal significa o seguinte toda vez que eu quiser consumir um dado do apica eu vou iniciar o consumo beleza e a mensagem que eu vou receber nesse canal eu vou a mensagem que eu o eu vou consumir essa mensagem tá que vai viro Aica e resultado desse consumo eu vou Colocar aqui tá a nesse canal e daí a gente pode ler esse canal e simplesmente jogar essa informação lá pro nosso sistema de trade então basicamente esse canal aqui é pra gente retornar o resultado do consumo que a gente teve
no ape CFC logo o cfca consome pra gente a gente pega essa mensagem e joga para esse canal pra gente poder trabalhar então vamos fazer essa implentação aqui primeira coisa que eu vou fazer eu vou criar um novo Consumer com a biblioteca do apach C Então vou colocar aqui consumer vírgula error né é New consumer com aqui o nosso camarada Ou seja eu tô passando o meu config map para eu configurar o meu consumer aqui para mim maravilha se eu nem conseguir consumir eu retornar na realidade eu vou dar um penic aqui para minha aplicação
travar mesmo beleza e aqui embaixo o que que eu vou fazer eu vou dar um subscribe topics e eu vou pegar Quais são os tópicos que eu vou me Inscrever para eu ficar recebendo as informações se eu não conseguir também se eu tiver um erro para eu dar um subscribe eu vou dar um Pânico nesse caso aqui pro meu programa parar mesmo tá normalmente esse Pânico é Tratado de formas bem mais elegantes tá para você conseguir retornar o programa rodando mas nesse exemplo eu não quero cair nesse nível de especificidade senão a gente não termina
nunca o programa e agora que eu tenho que eu tô inscrito eu Vou simplesmente criar um Loop Infinito que vai ficar lendo a mensagem aqui no cfca tirando a mensagem de lá independente do tamanho dela e agora eu vou fazer o seguinte tá se né não tiver nenhum erro encontrado para ler as mensagens o que que eu vou fazer eu vou jogar a mensagem que eu recebi aqui no CFC adivinha onde dentro do meu canal Então é assim que vai funcionar o meu consumidor Ou seja eu leio as mensagens Do cafca e jogo a mensagem
que eu recebi do cafc dentro desse canal aqui e quando a gente joga essa mensagem dentro desse canal a gente pode ler esse canal em outra parte do nosso sistema ou seja isso consegue rodar em trads Independentes no gol e quando eu falo trads tá Entenda como Gol rotinas que são trads Light gerenciadas pelo próprio Gol então A ideia é que isso Rode vamos dizer assim em background numa trad separada conforme ele recebe essa Mensagem uma trad vai ser sincronizada com a outra através dos nossos canais então é basicamente assim que vai acontecer a ideia
eu vou ter aqui o meu programa em go principal tá então eu vou ter aqui o meu programa principal que é o meu meu camarada aqui que roda minha tred principal aí o que que vai acontecer eu vou ter aqui dentro também uma outro cara que vai ficar consumindo mensagens mensagens do cafca conforme Ele consome a mensagem do Cica ele vai jogar essa mensagem em um canal então ele vai pegar essa mensagem e jogar em um canal Então vou colocar um como se fosse um canalzinho como se fosse uminha aqui ó um canal certo então
vou colocar aqui ó um canal um Channel aí o que que acontece eu vou ter um out progama aqui também que vai ser o meu sistema de trade né onde a gente tem o nosso book o que que vai acontecer toda vez que a gente receber essa mensagem o nosso book O que que ele vai fazer ele vai ler nesse nosso canal e se você lembrar aqui como que a gente fez o nosso book você vai ver que eu tenho incoming orders tá então a gente vai receber as mensagens do cfca jogando elas dentro desse
canal aqui é isso que vai acontecer o grande ponto é que o formato da mensagem que a gente recebe do cafca não necessariamente é o formato que a gente percebe tá que a gente vai colocar no nosso book então aqui a gente vai ter Que ter um D né pra gente fazer eformação né n informações para que a gente consiga transicion né uma transformação né vou ter que ter Transformers pra gente conseguir mudar o formato deada mensagem para adaptar em diversas partes do nosso sistema então é basicamente isso que vai acontecer aqui com a gente
tá Então essa que é a ideia principal Então a gente vai pegar a mensagem do CFC essa mensagem vai para um canal o Nosso book aqui tradebook vai ler esse canal essa mensagem vai ser transformada a gente vai processar né essa mensagem e uma vez que a gente processa a gente vai devolver isso para um outro canal né E esse outro canal vai publicar no cfca Mas vamos fazer essa parte aqui primeiro Beleza então Lembrando que isso aqui roda independente tá ou seja em background Isso aqui é uma outra trad né é uma outra go
rotina E aqui também é uma outra trad Com uma outra go rotina e elas se comunicam através do canal Então essa aqui é a nossa ideia aqui Então como que a gente vai fazer isso agora pessoal primeira coisa pra gente começar a montar esse esqueleto eu vou criar aqui dentro uma pastinha chamada CMD CMD é onde nós vamos ter no final das contas o nosso programa principal aonde vai ficar o nosso arquivo principal onde que a gente vai compilar inclusive e o nome desse projeto a gente eu vou chamar ele De trade né o nome
desse meu arquivo principal o arquivo principal Não o meu projeto principal e eu vou criar um arquivo chamado main.go aqui para mim tá esse arquivo M ele tem uma função e essa função Main é a que vai executar se você programa em Java por exemplo a gente tem o método Main que é o o entry Point da aplicação então por exemplo se eu der um print a LN Hello aqui para mim o que que vai Acontecer se eu chegar aqui embaixo no terminal e dou um go Run CMD trad main.go você vai ver que eu
executei aqui essa minha aplicação nesse Meu método Main Então essa que é a nossa ideia principal nesse momento e agora pra gente preparar esse m o que que eu vou precisar fazer eu vou precisar declarar os meus eu vou falar que as orders que estão entrando vai ser um canal de entity Order aqui para mim legal e eu vou ter Um canal de saída de ordens que são as minhas ordens que vão ser processadas né então eu vou colocar orders out onde eu também tenho o meu canal basicamente essas Order in quando a gente entrar
no nosso book vai ser esse cara aqui ó esse vai esse parmetro aqui que a gente vai trabalhar agora que eu tenho esse Order Eu também preciso fazer aquele esquema de sincronização group lembra que a Gente vai adicionando processos né e toda vez que processa a gente remove isso desse group manter a nossa aplicação funcionando e sincronizada tá então o que que eu vou fazer eu vou definir um group aqui chamado colocar aqui ponto weit group aqui para mim beleza agora que eu tenho o meu Sync p8 group eu vou fazer algo bem simples eu
vou colocar um defer WG weight o que Que isso o que que esse defer faz faz que depois que ele Execute todo o meu programa ele vai executar esse weight e o meu programa vai sair somente quando esse weight tiver concluído né ele tiver como done então é basicamente isso que vai acontecer de forma geral nosso programa ele não vai cair porque ele vai ficar rodando num Loop Infinito recebendo as mensagens o tempo todo e agora para eu conseguir trabalhar lembra que a gente Precisa aqui para consumir a gente precisa de um canal do Cica
que é um Cica message eu vou fazer isso exatamente aqui então vou fazer assim ó Cica message Channel dois pontos igual ao C fica aqui para mim e obviamente eu preciso copiar né esse c fica aqui para mim para eu fazer importação Inclusive a gente tá tendo um erro e esse erro é por conta que eu não fiz a eu não dei um go mod Tide para ele Baixar a minha dependência do apach Cica tá então agora que ele fez isso a gente a gente vai ver que ele parou de dar esse erro então agora
eu já tenho o canal de entrada das ordens o canal de saída das ordens eu tenho o canal onde a gente vai receber as mensagens a do CFC aqui para mim e agora nesse momento o que que eu vou fazer eu vou criar a configuração tá do meu consumidor do apach CFC tá então basicamente eu vou fazer assim ó consumer config dois Pontos igual Cica config map e aqui eu vou passar Qual é o servidor que a gente vai trabalhar servidor que eu vou colocar é host pdoc pinnal 2.994 por que que eu tô colocando
isso aqui porque a gente vai usar docker e mesmo que eu esteja rodando na minha máquina local né eu vou conseguir acessar a rede do docker através desse host então eu consigo acessar a minha Rede do docker tá Ah o nome aqui do meu grupo ID eu vou chamar ele de trade ou seja se eu tivesse mais temas desse conectando para ler as mensagens do CFC eles seriam agrupados através desse nome a gente não vai fazer isso inclusive tá a gente não precisa de outra Instância e aqui a gente tem a forma de Quando que
a gente começa a ler as mensagens então eu vou começar Vou colocar aqui que a gente vai ler as mensagens a partir da última que a gente receber na hora que tiver Trabalhando para ele não começar fazendo o processamento desde o início mas basicamente a o correto vamos dizer assim seria o earliest porque a gente garante que a gente pega todas as mensagens mas isso aí é um papo para outra hora Ah quando você tiver no curso full cy aprendendo de cfca com a gente você vai entender bastante como que a gente tá fazendo e
agora que a gente tem isso o que que eu vou fazer eu vou definir o meu consumer Aqui ó Então Eu Vou Chamar esse cara aqui de cica pnew consumer vou passar a configuração do meu consumer e vou passar né qual vai ser o tópico que eu vou ler as minhas é basicamente isso tá lembra que aqui no consumer eu falei que eu tenho um tópico que é baseado nas Strings aqui é basicamente isso que eu vou fazer e agora o que vai acontecer aqui com a gente e a gente tem que tomar cuidado é
o seguinte nós precisamos fazer o nosso Consumidor consumir correto colocar aqui ó a gente precisa fazer ess nosso consumidor consumir o problema aqui é que se eu rodar o meu programa dessa forma ele vai começar a consumir vai ficar num Loop Infinito aqui né E na hora que ele ficar nesse Loop Infinito o meu programa vai travar Aqui para baixo por isso que aqui a gente vai colocar a palavra go na frente e a gente vai iniciar uma nova go rotina Essa nossa go rotina ela vai permitir que a gente faça o que no final
das contas fique lendo essa mensagem em background numa outra trad tá uma trad gerenciada pelo go E agora o que que eu vou fazer eu vou criar um novo book pra gente fazer o nosso trade Então vou colocar book do Pont igual entity pon a newbook onde eu vou ter aqui né o nosso orders in o orders out e o nosso weight group que a gente precisa e agora eu preciso fazer o nosso book fazer o trade Desse cara problema é que novamente se eu colocar ele fazer o trade esse trade também roda num Loop
Infinito e se rodar num Loop Infinito o que que vai acontecer meu programa vai travar então o que que eu preciso fazer vou colocar isso também numa outra trad então esses caras vão rodar aqui em paralelo por isso que esses canais são importantes pra gente conseguir conversar a uma trad com a outra beleza E agora o que que eu vou fazer aqui no final das contas eu Vou fazer uma uma trad que vai ficar o quê lendo o canal do Kafka porque a gente tá consumindo as mensagens do cafca e jogando a mensagem para quê
para esse canal aqui correto Agora eu preciso ler esse canal Como que eu consigo ler esse canal eu posso criar uma função tá um Ford aqui vamos dizer que eu tenho uma mensagem onde eu vou ficar lendo a aquele canal e toda vez que eu receber uma mensagem nesse canal primeira coisa Que eu vou fazer eu vou pegar aquele wait group e vou adicionar um aqui para dizer que eu vou começar um novo processo beleza e somente pra gente ter um pouco mais de clareza em relação a debug eu vou colocar de uma forma meio
porquinha aqui mas somente pra gente olhar eu vou dar um print LN com string falando que a mensagem pon value aqui o que que é essa mensagem ponto vue a gente vai imprimir o que a gente tá recebendo do Kafka aqui pr pra gente Agora o grande ponto é que o a formato que a gente recebe a mensagem do cafca não é igual o formato necessariamente que eu tenho para conseguir mandar essa informação pro meu book pro meu trade então o que que eu preciso fazer no final das contas eu preciso transformar porque aqui eu
vou receber um Jon e eu preciso tornar esse Jon uma struct no final das contas então o que que eu vou fazer aqui dentro do meu projeto dentro do Market mesmo eu V Criar uma pastinha aqui chamada de dto que é um data transfer Object que ele simplesmente vai nos ajudar a transformar essa informação então o que que eu vou fazer aqui eu vou tenho um New e Eu Vou Chamar esse cara aqui de.go e pra gente não perder tempo tá galera eu tenho esse DIT pronto então vou copiar e colar aqui somente para você
ver tá como é que funciona eu tenho trade input significa o seguinte que toda vez que a gente lê o Jon do Luiz Que a gente vai receber a gente vai receber essas informações o Order ID investor ID asset ID concurrent shares share Price e Order Type tá e o que que significa esse Jon aqui que toda vez que ele encontrar o json nesse formato né ele vai preencher esse campo então aqui é como se fosse um um uma annotation tá isso a gente chama de tags no go para ele fazer essa Associação porque eu
consigo escolher como é que isso vai funcionar e da mesma forma que eu tenho A entrada do trade input eu tenho a Order output porque a gente também quando a gente processar a mensagem a gente vai retornar um Jon pro sistema do Luiz esse Jon a gente vai publicar no cafca Então a gente vai ter que poder também transformar isso num json legal e dentro do Order output eu tenho as minhas transações que são armazenadas dentro dele legal porque é um Jon encadeado então para isso eu tenho o transaction output onde a gente Traz as
informações que a gente precisa Então basicamente pessoal essas structs aqui elas são structs sem lógica nenhuma e elas servem apenas para pegar os dados de Jon e transformar em struct e pegar o dado em em struct e e transformar em json depois a gente vai ter que fazer uma transformação um pouco diferente pra a gente retornar o dado nesse output aqui mas depois a gente vai falar sobre isso nesse momento já que eu tenho essa informação aqui no meu main.go o que que Eu simplesmente vou fazer eu vou criar um novo trade input Então vou
chamar trade input e eu vou falar aqui isso é um dito ponto trade input aqui para mim em branco E agora o que que eu vou fazer eu vou usar uma função né uma biblioteca que o go já tem chamada Jon para ele pegar o arquivo em Jon né o conteúdo em Jon e transformar uct a gente chama isso de unmarshall né uma uma uma serialização aqui então vou fazer o seguinte error dois p igual Jon Unmarshal e eu vou fazer que eu vou pegar o mensagem P Vales e vou isso no trade input e
você deve estar perguntando Wesley Por que que você colocou e Comercial porque essa função aqui esse método aqui ele vai mudar o valor do trade input aqui dentro então aqui ele vai mudar na memória Aonde tá armazenado essa variável trade input então basicamente esse trade input vai ganhar os dados a serializados agora aqui pra gente e se a gente encontrar Algum erro eu vou dar um pic Aqui também tá eu não tô fazendo os tratamentos de erro ah de forma totalmente pura aqui para Inclusive a gente ganhar velocidade senão a gente não termina o projeto
nunca beleza e agora que a gente tem isso o que que eu vou fazer eu preciso pegar essa informação tá Ah e transformá-la da seguinte forma tá eu preciso Ah como isso aqui é um E esse json tem diversas informações eu preciso pegar esse json aqui esse trad input esse dto e preenchê-lo de uma forma que eu consiga ah pegar isso tá e jogar dentro no meu canal de orders in né então eu tô recebendo os dados do cafca eu peguei os dados do Jon e coloquei nessa minha struct burra vamos dizer assim ela não
tem nenhuma regra e agora agora o que que eu preciso fazer Eu preciso pegar desses dados dessa struct a aqui que só tem essas informações e colocar exatamente no formato que eu preciso do meu orders Ou seja eu tenho que transformar essa trade input em uma nova ordem basicamente é isso que eu preciso fazer então eu preciso ter um Transformer ou seja alguém que transforme isso num formato de uma nova Order que pode ser aceita no nosso canal de orders né então basicamente isso então o que que eu vou Fazer aqui eu vou fazer o
seguinte aqui dentro de market eu vou criar uma pasta chamada de transformer e dentro desse Transformer eu vou fazer o seguinte eu tenho simplesmente a um transformador de input e output basicamente O que que significa isso eu vou até Trazer isso aqui para vocês eu vou copiar e colar porque basicamente esse tipo de coisa é mais digitação do que entendimento tá basicamente o que Que esse cara faz eu tenho uma função chamada Transform input Ou seja eu vou receber o input daquele dito certo desse camarada aqui e eu vou retornar esse input D no formato
de Order esse aqui é o meu retorno eu preciso retornar esse cara nesse formato aqui ó onde eu tenho o meu investor eu tenho meu asset eu tenho o meu transaction então se você você perceber eu preciso construir esses objetos para eu ter uma nova Order para eu poder trabalhar então o que que eu Faço com isso eu crio um novo asset passando o input ass é asset ID Ah e eu coloco aqui né a quantidade de shares eu inicialize aqui com 1000 shares sempre por padrão aqui apenas pra gente ter uma inicialização de quantas
shares daquele cara tem no mercado tá aí eu tenho que criar o meu investidor Basic baseado no investor ID que foi Pass passado e agora eu vou construir a minha nova Order onde eu passo Order ID o investor o asset a as shares o price o Order a Order Type e eu verifico aqui ó se as quantidad de de shares que a gente tem agora é maior que zero eu vou ainda adicionar né Essas ações na carteira do meu investidor que eu tô colocando então eu adiciono essa isso aqui na carteira pro meu investidor já
tá com aquela posição daquelas ações e aí no final das contas eu retorno a minha Order tá então esse transformador ele vai transformar o nosso dto numa Nova Ordem aqui então nesse momento o que que eu faço aqui no Meu main.go eu vou fazer o seguinte eu vou pegar agora eu vou criar uma Order que vai ser um Transformer pon Transform input onde eu vou ter o nosso de aqui então agora com isso esse cara virou uma nova Order pronta pra gente trabalhar lá no nosso book o nosso book ele recebe a ordem aonde nesse
canal orders in correto então o que que eu vou fazer eu vou pegar esse meu orders in e vou jogar aqui dentro essa minha nova ordem de serviço tá Essa ordem de compra ou de Venda não interessa nesse momento então o grande ponto Agora é que agora eu estou conseguindo ler isso do apach CFC maravilha então agora a gente já consegue receber mensagens do AP CFC a gente consegue pegar essa mensagem transformar essa mensagem numa ordem jogar Essa ordem Ah num canal e esse canal né vai ser inserido aqui nesse nosso novo book e logo
essa ordem ela vai poder ser trada né ela vai poder ser Processada aqui dentro então basicamente é que toda hora que eu jogo algo na Order né esse book vai receber essa Order vai ler esse cara E aí a gente vai ter o processamento aqui maravilha então isso aqui a gente tá fazendo para consumir a informação o grande ponto que a gente tem é que se a gente rodar isso aqui também dessa forma Isso aqui vai travar o nosso programa para sempre concorda comigo porque ele vai ficar lendo nesse Loop Infinito o nosso cafca Então
o que que eu vou fazer aqui nesse momento eu vou criar isso como uma função anônima Então vou colocar assim go funk vou colocar isso aqui aqui dentro e agora a gente tem uma outra trad rodando aqui eu poderia até criar um isso aqui extrair dentro de uma função Ah e dar um nome para essa função para ficar mais bonitinho mas tá bom Aqui ó então aqui a gente sabe que a gente tá lendo do apach CFC legal e agora o que Que a gente precisa a gente precisa fazer o contrário a gente precisa agora
uma vez que a gente leu as mensagens do apach CFC a gente precisa publicar a mensagem numa P Cica com o retorno dessa ordem processada legal como que a gente vai fazer isso aqui no final das contas eu vou fazer um loop aqui no nosso final da seguinte forma vou colocar for Race né que é um resultado de uma ordem processadas é um Range de orders Out da onde que vem esse orders out a gente tem Um canal que a gente chamou de orders Out toda vez que o nosso trade acaba ele coloca o resultado
do da ordem processada nesse canal orders out e a gente vai ler esse orders Alt aqui pra gente conseguir processar a mensagem então eu vou pegar o output vai ser igual a Transformer e agora a gente precisa do transformer output onde eu vou fazer esse cara pegar a minha ordem e transformar no meu dito então aqui ó olha só o Order output eu recebo uma Order e eu retorno um D antes eu mandava um D no input e retornava uma Order aqui é o contrário eu recebo a ordem que eu quero transformar e Eu transformo
ela para um Dio porque vai ser nesse formato aqui ó que a gente vai precisar retornar Pro Luiz Ou seja a gente vai ter o Order né o order output a gente tem que adicionar as transações todas as transações dentro dessa Order né basicamente o que a gente tá fazendo é hidratando o nosso objeto né e depois a Gente retorna isso aqui no nosso formato do nosso dto então é basicamente isso que esse cara faz depois você pode olhar o código fonte com calma mas é é basicamente criar objeto e ficar iterando nesses objetos para
eles serem preenchidos agora que eu tenho esse camarada eu preciso transformar ele em Jon tá então isso aí pra gente é importante nesse momento também então eu vou deixar ele me ajudar aqui ó Jon output onde ele vai aqui ele fez marshal Ou seja transformou de Jon para struct e aqui ele vai transformar de struct para Jon basicamente é o caminho oposto e uma vez que a gente tem isso eu vou até identar um pouco melhor esse Jon vou até formatar ele um pouco melhor pra gente conseguir ver no log caso isso aconteça tá eu
acho que fica Talvez um pouco melhor então posso esperar um pouquinho ah deixa eu ver como é que eu posso colocar isso transforme eu posso dar um Marshall Indent Assim fica melhor certo e agora que eu tenho isso aqui eu simplesmente posso dá um print que nem eu fiz somente pra gente conseguir ver o nosso input e agora que a gente fez isso aqui a gente precisa jogar essa informação lá no apach CFC pra gente jogar essa informação na parte Cica a gente precisa publicar no canal Então a gente vai criar aqui um producer que
é um cara responsável para produzir ou seja producer PG e esse meu producer PG o que que ele vai fazer ele vai a fazer muito parecido com o que a gente fez no consumer tá então A ideia é que nós tenhamos aqui ó a o nosso package eu já tenho essa biblioteca pronta inclusive Ah e agora eu tenho o producer vamos ver se ele consegue me gerar basicamente eu tenho producer que é o meu config map que eu preciso aqui eu vou colocar config map onde C fica config map vou pedir para ele ah fazer
o meu Meu New Cica producer que vai receber o meu config map E vai retornar um producer aqui para mim basicamente é isso que ele vai fazer e agora eu vou criar um método chamado de publish esse publish ele vai simplesmente publicar os dados no canal do apach cfca como é que eu faço eu vou criar um método chamado producer publish e no publish eu vou passar uma a mensagem que eu quero e Quando eu coloco uma interface vazia do go quer dizer que essa mensagem ela pode ter qualquer tipo é tipo um n tá
porque eu não sei uma aqui que eu sou obrigado a passar ou seja uma forma de eu identificar alguma categorização dessa mensagem para escolher em qual partição isso ficaria isso a gente eu não quero estender isso agora aqui e eu tenho o tópico que isso vai ser enviado lá no ap Cica para mim com isso aqui pessoal eu posso ter Então o meu Producer Opa producer vai ser igual a CFC New producer se tiver um erro eu retorno o meu erro e agora o que que eu vou fazer aqui eu vou fazer o seguinte eu
vou pegar e vou criar uma mensagem do apach CFC no seguinte padrão a o nosso esse padrão vai ser a seguinte forma tá o velho da mensagem vai ser a minha mensagem ponto um slce de by por que que eu tô colocando isso porque o CFC Ele trabalha com a mensagem num formato de bytes basicamente isso ele trabalha de forma binária porque eu posso passar qualquer tipo de dado para ele legal aqui eu só fiz um casting aqui eu t passando aqui e aqui eu vou tá o algo que a gente chama de Topic partition
que em qual local essa informação ela vai ficar guardada no ape cfca porque o cfca pode ter diversas partições como se fossem gavetas onde ele separa essas mensagens para garantir Alta disponibilidade e aqui eu vou dizer basicamente para ele para ele fazer a publicação do tópico que a gente passou aqui para ele legal e vou falar para ele escolher a partição que ele mesmo vai colocar então ele define eu não vou forçar essa informação e agora que eu tenho a minha mensagem pronta do apach CFC o que que eu vou fazer eu vou fazer o
seguinte eu vou fazer ele produzir a mensagem se tiver um erro ele retorna caso não tenha erro ele retorna vazio ou Seja retorna que a função funcionou normalmente Então se esse erro for vazio beleza funcionou se esse erro vier com alguma coisa a gente vai pegar esse erro e poder tratar lá na frente então essa esse cara aqui é o responsável por publicar mensagens numa pare cfca e agora que a gente consegue publicar mensagens numa ape CFC O que que a gente vai fazer aqui no nosso main.go nós simplesmente vamos aqui fazer assim ó producer
ponto Publish vou ter que passar o output o o output ah out o Jason output aqui para mim vou ter que passar Qual é o nome do meu canal que no final das contas vou chamar ele de orders e vou passar aqui para ele na realidade aqui eu vou passar Qual é o tópico que ele que a gente vai jogar esse cara aqui então vou colocar processed orders por exemplo tá então é basicamente isso aqui é nome da nossa I tá então vou chamar essa aqui Também de eu poderia colocar o nome do asset para
ele separar as partições pelo asset Mas beleza vou deixar dessa forma e obviamente a gente tem que criar esse producer lá em cima Então vamos lá em cima onde a gente definiu a criação do consumer a gente precisa também fazer do producer então eu tenho consumer produz config e eu tenho um producer config também e aqui basicamente eu vou falar aonde que ele vai se conectar né ou seja Quais é o servidor do cfca que ele vai se comunicar e aqui embaixo ele já tem aqui ó producer New Cica producer passando o config pra gente
então a gente já tem essa parada aqui funcionando beleza e em tese galera a gente já tem o nosso programa tá então a gente terminou o nosso projeto agora a forma da gente testar isso aqui ela pode ser de forma geral simples Eu tenho um docker compose aqui que eu vou copiar e colar aqui para vocês depois o luí ele Pode inclusive atualizar esse docker compose para tá esse docker compos basicamente ele tem o z Keeper que o Kafka usa para utilizar para rodar para gerenciar os nodes dele e a gente tem o o apach
CFC aqui criado e aqui a gente tem o control center que é uma interface gráfica pra gente gerenciar e e ver os nossos tópicos no apach CFC tá então com isso aqui o que que eu vou fazer agora eu vou dar um um docker compose app - D e agora ele criou e subiu né esses meus serviços no docker para mim e uma vez que esses serviços subiram a única coisa que eu vou fazer nesse momento vai ser o seguinte eu vou criar esses tópicos pra gente não ter problema tá então eu vou criar um
tópico chamado orders e um outro tópico aqui chamado de process process orders aqui para mim então para isso Se eu olhar aqui ó o meu control center do carro fica na porta 9021 então eu vou abrir aqui o meu nave Vou entrar local host 2. 9021 Vamos ver se esse nosso cara já iniciou vou entrar aqui vou criar um tópico chamado de orders vou criar um outro tópico aqui chamado de ah orders processed orders aqui para mim maravilha agora que eu criei esses dois caras ah em tese eu tô pronto para rodar o meu programa
e pra gente testar E como que a gente testa isso aqui bom na realidade vai ser a de uma forma bem simples eu vou rodar meu programa vou dar um go Run CMD trade main.go e agora o meu programa está rodando meu programa em tá rodando O que eu preciso fazer agora é simular o Luiz jogando uma mensagem no meu cfca basicamente é isso que eu preciso então eu vou pedir aqui para mim pro meu cursor que seja né fazer o seguinte para Ele eu vou pedir por favor por favor Gere um Jon no formato
do @d de trade input para eu jogar no tópico do apachi Cica Vamos ver se esse cara gera isso aqui para mim e ele tá gerando aqui para mim um exemplo Beleza então esse dado aqui eu tô confiando aqui no meu na minha ia tá onde ele tem 50 shares esse aqui é o preço e ele tá querendo vender Uma uma uma ordem de venda que a gente tem aqui então eu vou copiar esse cara aqui e vou jogar no meu apach Cica no meu tópico de orders aqui para mim vou aqui em mensagens e
vou produzir uma nova mensagem aqui para mim como se o Luiz tivesse fazendo isso né ele vai fazer isso através do nestjs vou dar um produ e agora que eu fiz a mensagem foi e agora que foi aqui ó eu já consegui ver o print automático que aconteceu aqui ó Então realmente funcionou ó nosso Programa inov deu aquele print a que uma mensagem ela foi produzida agora o que que eu vou fazer eu vou pedir para ele dar também para mim né Gere agora um outro Jon de Order de compra que demete para essa Order
de venda Beleza então ele gerou um outro cara falando que quer comprar esse cara aqui é 155.700 Esse cara aqui em tese nesse momento agora ó a gente já recebeu olha só que legal galera a gente recebeu a mensagem e a gente já viu a Order falando que ela tá fechada né a quantidade de shares é 50 a parcial é zero porque ele já comprou todas as cotas e a transação que ficou registrada agora a gente tem que ver se isso aqui foi pro ap cfca então eu vou aqui nos tópicos vou na minha ordem
processada vou ver as minhas mensagens vamos ver se ele carrega para Ver se essa mensagem realmente foi produzida para cá e tá aqui galera ele recebeu uma mensagem provavelmente do recebimento do processamento e o outra da conclusão do processamento né então vou clicar aqui pra gente conseguir ver e tá aqui o Jon galera esse Jon aqui ó é a ordem processada que o Luiz vai receber no sistema dele para fazer atualização dizer que essa ordem já foi liquidada então meu povo tão comprida aqui pra gente nós Agora temos o nosso home broker né com esse
backend funcionando integrado com a parte Cica rodando com docker e tudo mais agora vai ser o seu próximo passo de integrar tudo com luí Carlos e ele vai utilizar esse nosso programa para fazer isso então vamos lá salve 10 beleza Lu Carlas na área que bom ter você aqui comigo firme nessa jornada nós vamos terminar Então o nosso projeto agora nós vamos fazer o restante da Integração ali com home broker fazer Integração com kafica e ver tudo funcionando então nós vamos ter o frontend se comunicando com a o Home Broker depois com cfca o golang
vem a volta de novo aí tem o websocket da volta notificando ali os preços ativos e as mudanças que nós fizemos né o projeto vai ficar muito top então simbora lá para poder finalizar vamos lá pessoal nós vamos terminar a integração agora do lado do Home broker mais uma vez Voltamos para ele né pro nojs e cada Linguagem tem a sua forma ali de conectar no CF comas suas peculiaridades no caso do nest nós já temos uma base bem legal para poder fazer essa conexão mas infelizmente Ela depende do CFC JS CFC JS é a
Lib hoje mais famosa da comunidade node para conectar uma aplicação node no CFC inclusive ela até era mantida por um brasileiro mas o que que aconteceu com essa Lib por enquanto ela continua ali num Limbo que ela já tem mais de um ano que não tem nenhuma Mudança nenhum comite nem nada a comunidade tá ali decidindo o que vai fazer e não há decisão nenhuma então você tem algumas empresas abandonando CFC JS porque tá uma incógnita e eu não vou trabalhar com essa integração Nativa tá aí a confluent que faz várias coisas ali pro Cica
ajuda todo ess ecossistema da ferramenta eles decidiram criar uma Lib para suprir essa necessidade chamada de confluent cica JavaScript a Lib que já tá estável pode Ser usado em produção e nós vamos utilizá-la tá então eu vou pegar esse npm instal aqui dela e vou colocar aqui então nós vamos usar uma integração personalizada porque senão a gente fica dependendo do kafica JS e a gente não quer passar para vocês algo que eh pode ser abandonado daqui algum tempo né porque você não as pessoas não sabem se vai ser abandonado você não é e a gente
não vai querer usar isso no nosso projeto tá eh Além disso nós vamos Precisar também do pacote de microservices do nest podia ter instalado junto na verdade tá pronto aí posso fechar deixar esses arquivos aqui abrir de novo ele não pode mostrar nenhum errinho Fora as questões de ex lint quem não tem problema então eu já criei aqui uma pasta Cica isso Inclusive a gente passa dentro do curso full cycle essa aqui é integração porque a gente tem que criar uma Instância que Gera ela serve mais para gerar um consumidor né se você precisa de
um produtor que vai publicar as mensagens não precisa de isso aqui então esse confluent kafica server ele vai gerar ali o consumidor com tudo que tem direito né são várias configurações eu não quero focar nisso aqui e nem construir do zero que não é o intuito então nós já temos tudo isso pronto ele vai gerar o consumidor pra gente e tem aqui o contexto o Kafka context que é justamente a o contexto que nós podemos receber lá no consumidor com todas as informações pertinentes àquela mensagem que nós estamos consumindo Então eu tenho aqui a mensagem
propriamente dita Qual é a partição Qual é o tópico a Instância do Consumidor heartbit ele fica vendo ali se eh o cfca tá ok o consumidor também e uma Instância de produção Se eu precisar tá então isso aqui já está pronto eu só Quero mostrar que que está de novo aqui dentro do projeto Então a primeira coisa que eu vou fazer aqui é criar o meu consumidor tá poderia até fazer via comando do nest el manou um comando específico para poder criar um consumidor vamos fazer aqui um orders p consumer TS aí vou exportar um
Order consumer e aqui nós vamos ter o método handle Vou Colocar assim handle trade Aqui vai envolver a negociação que tá acontecendo aqui em cima eu tenho que colocar um @ controller no consumer tá e pode parecer estranho porque quando a gente lembra de Controller tá lembrando ali de algo com http e tudo mais mas eh os consumidores do nest você coloca Controller aqui e ele fica registrado na parte de controllers justamente por quê Porque se ele esse módulo aqui for importado em Outro módulo ele não vai duplicar esse não vai gerar outra Instância desse
consumer só vai ser é gerado quando esse módulo foi importado no aqui no módulo raiz né então esse cuidado que ajuda a evitar eh problemas Beleza então nós vamos ter esse handle trade em cima dele vai ter um decorator chamado de event pattern que nós importamos do pacote de microservices do nest code até normalmente me dá aut completar aqui mas como não me deu T Digitando do zero Então como o Wesley fez lá tem o tópico de entrada das ordens que ele a aplicação dele consome e nós vamos publicar daqui a pouco e tem o
tópico de saída que nós vamos consumir para poder fazer o término dar continuidade à negociação tá então aqui eu recebo a mensagem aqui eu não quero receber aquele não preciso receber aquele contexto todo eh eu posso declarar para poder manipular mas não tem necessidade aqui Eu posso colocar a mensagem diretamente e aí eu posso colocar um payload ao lado dela tipo que a gente fez com o Gateway Apesar que a gente nem fez né o payload ele ajudaria em casos que a gente poderia validar essa mensagem aqui já evitar que ela chegue na lógica do
método enfim é bom deixar esse payload aqui do lado então nós vamos ter aqui os nossos dados de entrada Vou Colocar assim Export trade CF message que é bom no mínimo a gente ter uma modelagem dos dados de entrada e eu já tenho aqui a tipagem para não ter que digitar todos os campos né a gente vai receber exatamente essas informações que o Wesley já mostrou Vamos só repassar elas aqui eh eu recebo então Order id o id do Investidor o ID do ativo se é uma ordem de compra e venda nós já temos temos
o nosso N1 lá com by Cell o status tá Open tá closed o partial que é quanto que resta ainda né tem o shares e o transactions com as transações e a gente vai focar sempre pegar em pegar a última transação que vai ser importante pra gente ISO aqui já é um aviso de como que vai funcionar as coisas então fica ali e pronto vamos colocar aqui um um conso Log em Messager Então esse consumidor né Às vezes a gente pode pensar que é algo mais difícil de fazer ou com muitas linhas Veja com apenas
pouquíssimas linhas mais uns decorators já tá acontecendo Então a integração ela é mais mastigada né em comparação ali com golang não é num demérito nem nada mas apenas uma facilidade para que a gente possa trabalhar para poder fazer o início desse consumidor eh a gente teria que fazer uma Configuração aqui no main.ts seria uma opção tá tem aqui Um Connect microservice mas e apesar de ser uma opção tem que tomar cuidado porque aqui por esse main.ts a gente tá iniciando o quê http e websocket daria para poder iniciar junto esse consumidor do CFC sim mas
aí taria tudo gerenciado aqui no um Bootstrap só e aí a gente perde resiliência né quando eu quiser escalar essa aplicação http eu acabaria gerando réplicas desse Consumidor também então é bom a gente ter Vertentes separadas separar essa vertente de http do próprio cfk em si então Eh eu vou chegar aqui em cima vou criar a pastinha pon comand ponto para ela ficar sempre aqui no topo E aí vou criar um cica.com PTS tá então o conteúdo vai ser parecido com o Main ele é um Main na verdade mas eh a gente só vai iniciar
aqui o consumidor então ele vai importar aqui o Next Factory o app mod a essa parte aqui eu posso retirar a invés de fazer o Create nós vamos fazer um Create microservice para focar somente na questão do Caf aí eu vou ter aqui um segundo Array com o strategy como a gente tem uma integração Nossa com caica Então usa esse strategy se você for lá na documentação eh n GS tem integração com ris rmq outras coisas né você eh passa apenas um objeto aqui só com as Credenciais ali da ferramenta mas aqui a gente passa
o new confluent Cica server E aí nós vamos passar a opção para ele tá aí aqui eu tenho que importar estranho que o vs code tá que tá preguiçoso vou ter que voltar aqui um diretório coloco Cica Cica confu server aí tá aqui aí nós vamos passar aqui o server com o Bootstrap service nós temos Aete para isso por enquanto nós vamos usar eh eu vou até agora trocar de tela até aproveitando e eu tenho a aplicação do Next que tá com esse azul que eu coloquei aqui com a cor do react e a aplicação
do golang tá nessa cor né da a marmotinha lá do golang esse o tom de azul mais escuro eh eu queria só confirmar se a porta tava exposta aqui essa 9094 que é para conexões externas Então por enquanto eu posso usar essa porta Aqui e Inclusive eu já até aproveitei para poder acrescentar aqui um Command no contêiner do Cica porque com a configuração que o Wesley tava utilizando se você subisse o os contêiners aqui do Cica e desligasse sua máquina e tal enfim desligasse o Dock e voltasse novamente você teria que fazer um Down e
um up beleza funciona mas se você fizesse um up depois de só parar os contêiners o zer AC acaba dando um erro que é o server Discovery que tá aqui em cima enfim isso pode tornar um pouco mais burocrático aí eh a diferença aqui agora com esse comando é que ele vai demorar eh no mínimo 30 segundos para poder subir né é só aguardar um pouquinho para ver as coisas funcionarem então vamos fazer aqui um docker compose up que eu não tenho aplicação rodando né Eh aí ele vai começar aqui a brincadeira esse Command Inicial
né ele faz um slip ali de 30 segundos para depois sim rodar O executável ali que vai acabar desencadeando no de rodar o CFC então o zuker roda ali e fica esperando o kafica subir tá beleza Eh enquanto ele tá ali vamos terminar aqui então eu vou colocar local host na porta 94 90 94 tá E aí eu vou colocar duas três opções na verdade pro consumidor que é legal Vou permitir que ele crie tópicos e por default o session time out vou colocar 10 segundos que é em milissegundos e o Rebalance time out 10
segundos também essas duas informações aqui servem porque quando a gente ficar fazendo um save nos arquivos Vocês já viram que ele compila de typescript para JavaScript ele levanta o processo novamente então o k fica e recebe essa nova chamada ali do consumer E aí fica demorando mais uns segundos então isso aqui faz com que a gente diminui o tempo de rebalance da sessão para ele poder ir um pouquinho mais Rápido tá então eh a gente faz isso aqui uma vez que eu tenho a Instância desse microservice é bem parecido com http a gente faz um
Listen só né não tem uma a porta que o consumidor não vai ser exposto numa porta a gente pode até colocar um podia ser com log do nest ou alguma coisa assim eh starting CFC micros tá beleza e vamos dar uma olhadinha aqui para ver se tá ok a gente Já tem eh vários logs é uma maneira eficiente de verificar se tá tudo OK é só acessar lá o local host na porta 9021 para ver o nosso cluster tá de pé né então aqui eu já tenho os dois tópicos que estão criados né o de
input e de output até acho que eu não tenho mensagens estou presumindo até ten algumas tenho algumas Eu acho que eu vou até fazer o seguinte aqui eh vou excluir esse tópico porque tem acho que tem muita Coisa depois vai ficar estranho para que a gente a gente veja as coisas funcionando Vamos criar os tópicos aqui novamente então tópico de input tópico de output então com isso aqui pronto agora eu consigo fazer o npm Run start Dev que vai rodar http mas eh eu posso fazer o comando para poder apontar aqui para esse cfic agora
deixa eu só olhar uma Coisa aqui no meu banco de dados Só para confirmar aqui tá tudo ok e deixa eu fechar que tem 500 coisas abertas aqui e vamos fazer o seguinte aqui Primeira coisa eu vou rodar aquele servidorzinho das imagens né Vamos deixar ele rodando aqui aí coloco mais um eu vou colocar aqui Imes aí agora vamos rodar o mongo beleza aí eu posso usar o start Dev mas Aí se eu passar Exatamente esse duplo Dash depois menos menos ent file apontando pro Arquivo ele não vai rodar o main.ts vai rodar esse arquivo
aqui para poder criar apenas a Instância do Consumidor PR gente poder brincar né tá eh ele tá chiando aqui comigo será que eu desinstalei por algum motivo eu acho que eu devo ter desinstalado não creio mas acho que sim vamos colocar aqui OB Nestjs web sockets por algum motivo não tá instalado mas agora tá beleza ele deu aqui um erro da compilação só ver como é que ele tá mandando esse eu acho que esse ponto Eu até queria acho que é melhor usar poder ter colocado só Command né mas para que a fique fácil aqui
eu coloquei É vamos fazer aqui agora com o und tá agora deu certo que eu com ponto questão de módulo aí não tava rolando aqui eu tenho que voltar um diretório alinhei tudo bonitinho ali e agora tá aqui a nossa resposta de sucesso né E então ó start Cica microservice ele vai mostrar tem uma Instância que vai conectar a IPI rest do Cica de forma administrativa a partir dela eu posso criar tópicos aqui do nest e tal tem uma Instância de de producer que ele já cria por padrão e de um consumidor Então já tá
ok já tenho aqui a Instância do meu nestjs consumer eu consigo ver essa Instância eh aqui em consumers ó ele cria esse nestjs group consumer tem como mudar esse nome então já está ok então se eu chegar aqui nesse output só pra gente poder ter uma mensagem qualquer produzida eh como ele já dá essa mensagem aqui ótima vou produzir a mensagem e nós temos que ver o conteúdo Dela tá vendo Então ela já chegou aqui no nosso consumidor fácil né a gente consome a mensagem já transformada no Jon ela já chega aqui no formato que
tem que ser então o que vai acontecer aqui agora nós vamos pegar o serviço de orders que é o orders service orders service E fazer um service Create trade Que Nós criamos lá na primeira aula mas nós não demos atenção justamente para poder deixar nesse momento aqui agora né Porque aqui nós vamos receber as informações e registrar o trade atualizar o preço é porque a negociação pode ter mudado o preço adicionar o novo registro no Diário do ativo no asset Daily diminuir também o ativo ali da Wallet da Carteira do usuário enfim nós Temos muitas
operações a serem feitas aqui E esse trade vai ser justamente aquela modelagem Que Nós já tínhamos lá atrás ele vai ter o ID Qual é o ID do o investidor relacionado não eu que estou eh fazendo a negociação o outro que tá fazendo comigo e qual é o ID do trade lá da plataforma lá do golang do Wesley a quantidade é negociada o preço e as datas de criação e atualização então a gente vê aqui uma relação com orders uma Order tem uma ou Vários trades tá a gente já viu como que funciona isso lá
na primeira aula já fizemos isso bastante então Eh eu não vou fazer isso aqui do zero exatamente eu já tenho aqui a minha entidade de Trader ela tem tem lá o ID a relação com a Order aí como nós vamos ter lá do lado contrário na Order os trades envolvidos aí eu estou colocando a referência em string para não ter aquela aquele Import circular Mas ó Ten o related investor id O broker trade id e o [Música] shares tá então tudo aqui aí em Order eu vou ter que fazer uma mudança aqui embaixo a gente
vai colocar trades é um relacionamento né de um para muitos então ou eu tenho aqui a coleção de trades ou uma coleção dos ids dos trades então venho @pr aí eu coloco aqui que o Type vai Serus [Música] types string e a referência vai ser trade aqui falta Fechar isso daqui pronto então como na Wallet Wallet asset toda vez que eu cadastro Wallet asset eu vou ter que eu teria I que acrescentar na posição de assets né a mesma a mesma história aqui ó a gente fez isso lá na aula a vez que eu Cadastro
aqui o ativo da carteira eu tenho relação tenho o ID do Wallet mas tenho o ID do Wallet asset empilhado aqui né nós fizemos isso apenas para poder criar o ativo né né A que tá vendo aqui ó que nós fizemos o push Então nós vamos ter que fazer isso também então esse o primeiro detalhe aí claro uma vez que eu tenho esse trade ter que chegar aqui no meu módulo E publicar melhor importar o trade aqui é pra gente poder fazer a manipulação Então vamos fazer aqui a nossa operação de Create trade eu vou
colocar aqui um creat trade.do PTS eu já tenho aqui as informações pertinentes apenas estou colocando no estilo k casing para poder manter o padrão que a gente já estava trabalhando né no status lembre-se que eu recebo o Open ou closed né então aqui eu vou receber o dto que é eh Create trade det para que a gente possa adiantar um pouco eu vou pegar a lógica do que a gente tem que construir eu quero focar mais em que vocês entendam eh todas as responsabilidades e as consequências porque esse método aqui na nossa aplicação vai ser
o método que mais tem linha de Código ele vai envolver muita lógica Então olha só vamos colocar um E5 aqui na frente porque a gente tem muita promessa nós vamos ter alteração de preço do asset vai ter diminuição ou soma lá no Wallet asset porque se eu tô comprando ou vendendo eu tenho que debitar da minha carteira vai ter a inserção do próprio da instância do trade né para poder fazer esse trade vão ser várias Atualizações ou inserções no nosso banco de dados nós já aprendemos lá na primeira aula que se eu não trabalhar com
o modo transação eu não vou garantir consistência né porque se alguma no meio do caminho alguma das operações falhar eu vou ter a operação ali inconsistente pela metade e no não vou conseguir reverter isso e vai gerar uma confusão enorme no meu sistema ainda mais uma aplicação financeira né então nós iniciamos aqui mais uma vez o modo Transação e assim eu tenho que colocar aqui a Connection a gente tá trabalhando aqui com a Connection né para poder gerar ali o modo transação eu coloco aqui a Connection vai ser mongus ponto Connection e tem que colocar
o decorator e em Connection aqui aí nós iniciamos aqui o nosso modo transação né Beleza para iniciar esse modo Transação é necessário criar essa sessão Então a partir daqui nós vamos fazer todas as operações ligadas a essa sessão até mesmas consultas bem a consulta ela não causa nenhuma mudança no banco né né mas eh a sessão ela é interessante Porque tudo que tá dentro da sessão é consultável né se você eh não coloca às vezes uma consulta ali dentro da sessão você pode não capturar alguma coisa que você acabou de criar porque ela Eh está
você acabou de criar alguma coisa usando a sessão Aí logo em seguida você quer consultar aquela coisa ali para poder fazer as próximas regras de negócio então aquilo não está dispon Então tudo tá a gente tá colocando section Então olha só na hora de fazer aqui a a consulta da orda para ver se ela existe né Eu não sei exatamente se ela existe a gente tá fazendo aqui essa chamadinha com o find by ID na verdade nem precisa passar esse segundo Array Aqui eu passo o session para falar ó essa consulta aqui tá dentro da
aqui nem precisava mas a gente já tá incluindo eu tô falando que eu vou receber aqui um document e aqui vai ser só dto certo então se a ordem não existir ordem not aí eu já posso incluir a minha trade mas na hora que eu vou incluir ela que a gente fez na primeira aul quando eu incluo session aqui para a session controlar e poder fazer o rollback Depois ela devolve uma coleção de documentos né porque eu posso incluir mais de um Então tem que lembrar de colocar um trade doc para deixar isso claro e
pegar a trade e Esses errinhos que estão apontando aqui é de SL lint a gente não deve se importar tá vamos pegar isso aqui mudar para dto que é o nome da variável que eu estou utilizando então Consultei a orda beleza criei a trade aí eu estou pegando o Partial e diminuindo aqui pelo shares Na verdade vou até fazer uma coisa aqui vou mudar esse shares para shares apenas aqui nesse par eu sei quantos que quanto que resta ainda para poder negociar né então é um saldo que nós temos na ordem coloco Qual que é
o status que ela Sea Open Ela ainda tá aberta vai ter novas negociações ou se ela está closed né Aí eu acrescento na minha coleção de Trades de Order o ID da trade que eu acabei de criar né que eu tenho que ter a relação dos dois lados aí o que tá faltando aqui Inclusive eu tenho que incluir aqui a Order que é order.id também todos os campos né porque a gente tem aqui a Campo de Order faltando ele agora essa parte aqui vai ser reservada para que a gente possa atualizar o preço Dos ativos
nós precisamos entender que esse consumidor que o consumidor não tá aqui né esse consumidor ele vai receber a notificação das duas ordens tanto a de venda quanto a de compra então e eu não vou atualizar o preço dos ativos duas vezes eu escolhi Apenas quando é compra Tá Então nesse if eu verifico se o status da ordem está fechado que eu só vou atualizar o ativo se esver fechado e se for uma ordem do tipo compra que o Order Type não tava importado Então vou lá consulto asset passando a sessão sempre passando a sessão aí
eu vou verificar se o asset updated at e aqui Inclusive eu posso até colocar aqui isso aqui vai retornar um asset document que aí eu tenho o update adat aqui Né A gente vai ver os errinhos de typescript que ele ainda permitir se a data de atualização do ativo for menor que a data do trade Então significa que eu tenho né um novo preço então eu coloco aqui dto Price no ativo e faço um save Ó tipo que a gente tá fazendo com a Order tá bem parecido isso aqui a gente vai entender o por
que a gente tá fazendo algo assim tá aí eu pego o diário do Ativo consulto ele e aqui vem uma lógica se eu já tiver o diário do ativo com aquela data em questão data que a gente recebendo aqui do trade com a o ID do ativo se eu não tiver na verdade a gente vai fazer a criação e aqui mais uma vez né Lembrar de passar o Array porque quando eu passo o session aqui como segundo parâmetro eh Apesar que o diário do ativo não vou precisar da instância dele não tem Nenhuma variável sendo
armazenada Mas eu só crio o diário do ativo se não existir para não ficar duplicando eh O Diário do ativo naquela data específica Então essa parte serve para atualizar o preço e para atualizar o diário do ativo aí vem a parte agora para atualizar a carteira então se eu tenho uma ordem que está fechada eu vou consultar minha carteira Olha só find One passando o ID da carteira Na verdade eu tô consultando o ativo da carteira Não não a carteira Específica passo o ID da carteira o ID do ativo aí coloco ali a sessão então
se eu não tiver o ativo e a o tipo da Order for de venda como é que eu vou fazer o débito não tenho né então o ativo não foi encontrado na carteira já retorno aqui um erro agora caso contrário que que nós vamos fazer eu vou eu deixei aqui alguns comentários a gente vai falar disso depois né Tem várias validações que poderiam ser feitas aqui eu vou fazer o Débito ou crédito então tendo o Wallet ID aí eu vou ver se a ordem é do tipo compra então eu vou somar com a quantidade que
eu tenho né que o shar tá ali Caso contrário eu vou diminuir fica bem pequenininho agora caso eu não tenha significa que eu acabei de comprar porque se eu fiz essa validação aqui em cima da venda eu não tenho ativo nós só vamos Criar uma nova posição lá no Wallet asset então aqui vira dto e aqui shares passo a sessão mais uma vez aí como tem sessão aí ele retorno aqui vários documentos eu pego w Wallet asset e tenho que acrescentar o ID desse novo Wallet asset na minha carteira e faço save que eu tenho
que ter os ids no Em ambos os lados né o ID da Wallet no Wallet asset e o ID do Wallet asset em Wallet pronto aí eu faço o commit depois de Tudo isso e retorno essa Order que foi feita né que não não importa se eu estou trabalhando com CFC ou não é indiferente a isso caso dê erro nós abortamos isso aqui vai fazer o RB a gente já viu isso e estour o erro para outras camadas da aplicação E aí nós finalizamos a sessão esses erros que aconteceram são porque nós vamos precisar de
acessar os esquemas né então nós vamos pegar aqui ó deixa eu até já copiar para poder ficar mais Fácil nós vamos precisar desses esquemas que nós estamos fazendo as manipulações ali embaixo né Beleza acho que agora ele vai sumir a maioria dos erros aqui e outros é de lente que ele continua pentelhando aqui com a gente então eu vou precisar pegar essa galerinha toda e jogar lá pro meu Order mod então importa aqui tem que importar todo Mundo a gente viu ali o nível de complexidade né são muitas coisas acontecendo eu tenho que garantir que
ou será que ele importou Wallet Ah demorou um pouquinho para poder sumir o eu ou eu garanto que isso aqui tudo deu certo ou eu descar são muitas operações acontecendo ainda tem um dto aqui solto tava errado né a variável deixa até ver se eu não temho mais esse Create dto tá Aparentemente o restante Tá Ok então Maravilha tenho toda a minha operação aqui e a gente vai testar ela com o consumidor mas aqui eu já quero apontar um problema vamos imaginar tô pegando aqui só o caso da do Wallet asset aqui talvez com uma
conta bancária o exemplo de uma conta bancária seja mais interessante vamos supor que você tem na sua conta bancária R 100 E aí você e e outra pessoa vão sacar Cada um vão sacar 10 Vocês estão em lugares distintos em caixas eletrônicos distintos então ao final dessa transação a gente tem que ter 80 na conta mas eu vou ter vocês estão sacando exatamente na mesma hora se a gente não tiver um controle sobre essas transações con correntes ao final posso ter 90 que acontece muito em Sistemas É porque quando você vai fazer aqui o seu
saque né você faz um 100 Men 10 aí o outro também tá fazendo 100-1 não há Nenhum bloqueio para essas transações concorrentes né eu tenho que fazer algum tipo de bloqueio alguma lógica que impeça que eu faça esse saque ao mesmo tempo eu tenho que ter o valor atualizado da minha conta enfim eh Existem várias formas da gente fazer esse bloqueio aqui em bancos tradicionais a gente tem o o lock chamado de lock pessimista pessimista que eu posso fazer um travamento em nível de do banco como um todo né que é Mais menos usual em
nível de tabela e em nível de registro eu poderia travar ali o registro da conta nesse caso para que se tem algum saque ele fique o as outras transações fiquem esperando essa primeira terminar aí as outras vão acontecer então não tem problema de saldo a questão é que existem vários tipos de Locks também que eu não quero abordar aqui mas existe um outro tipo de lock que é o lock otimista bancos no sequel não implementam ou tendem não Implementar esse pessimista éo difícil você achar um no que implementa mas no normalmente implementa otimista o otimista
Em vez dele travar totalmente a estrutura ali o banco de dados a tabela ou registro na verdade ele não trava nada e ele cria um versionamento pro registro ou pro documento no caso né a gente tá usando aqui então no caso do mong já tem até um vezinho lá no documento que vocês devem ter visto na primeira aula que ele tá igual a zero Então no caso eu faço uma consulta do registro por isso que a gente tá fazendo a consulta dessa forma aqui por exemplo pegando Eh toda vez que eu posso ter esse re
esse esse Race condition a gente vai fazer a consulta e vai fazer o save separado que é o mod aqui do mang de trabalhar então eu faço a consulta eu vou ter que habilitar esse Lock pessimista ainda mas eu fiz a consulta faço a minha lógica de Negócio e depois faço save então quando eu for fazer o save aqui eu verifico se a versão do documento pode ser um número inteiro pode ser uma data ela é igual a versão que eu tenho a versão aqui na memória Se tá igual a versão que tá lá armazenada
no banco se tiver diferente significa que alguém fez alguma mudança então eu lanço uma exceção então não trava nada então eu sempre verifico se a versão bate para ver se é a mesma versão De quando eu Consultei tá então a gente vai usar essa estratégia e pensando aqui nessa em toda essa execução né Eh eu posso ter orders acrescentando ou diminuindo quantidades dos ativos que eu tenho ao mesmo tempo ali comprei a eu tenho duas ordens diferentes que eu comprei a ação da Amazon né então se isso aqui desse um erro com esse Lock otimista
eu vou reprocess de novo quando Como eu tenho consumidor com Cica tem como fazer tratamento de erro e se você deu um erro que é recuperável você tenta reprocessar n vezes até você conseguir tá a gente não vai ter tempo para poder fazer tudo isso mas eu já quero mostrar aqui os apontamentos né do que você pode fazer para poder brincar a gente tem muita coisa que pode ser construída nessa aplicação para que a gente veja como que funciona e São coisas que funcionam em aplicações grandes tá então Pra gente poder fazer essa habilitação de
modo travamento otimista a gente chega em cima de cada Collection que é necessário por exemplo na Collection de ord ali como eu tenho a questão do partial né tomar muito cuidado porque esse paral que tá aqui em cima ele tem que estar certinho independente do número de transações que estão chegando ali para aquela oda então a gente coloca assim optimistic Concurrence que é a palavra otimista né iG então is para também os assets e para Wallet asset que é onde corre esse risco da gente ter uma informação consistente porque tem soma no meio tá nessas
três aí agora eu tem que tomar cuidado porque essa opção aqui é bom que a gente tenha [Música] é bom dar uma limpada no banco tá então Vamos pegar aqui ó o nest Vou digitar aqui o nome el excluir quando ele voltar de novo ele acaba criando tá Então tome cuidado para não ter nenhuma surpresa então funciona sempre assim com caso do mongus você faz um find One ou find by ID como a gente tá tá fazendo com Order com Wallet faz as mudanças e depois faz o Save é aqui que ele vai checar as
versões tá aí que ele checa as versões então ele já faz isso automático eh não tem que fazer mudança nenhuma nesse código mas o asset também é consulto fiz a mudança do preço e depois faço o sav afinal das contas aqui ele vai est fazendo update One no final das contas se você olhar o código por trás e etc aí como nós já temos aqui então a questão do serviço pronto É vamos chegar aqui no Controller é melhor Controller não Consumer né e colocar todas as informações pertinentes então aqui eu tenho que colocar is que
ait porque ele tem que esperar isso aqui ser processado é muito importante isso aí agora nós vamos colocar todas as informações até para não ter que ficar digitando aqui nós vamos fazer assim ó da mensagem eu quero sempre a última transaction que o Wesley tá me entregando então eu chamo Create Trade Aí passo o ID da Order o status aí o related investor id e como ele me manda aqui na transação né Se for ordem de compra eu pego Seller Caso contrário eu pego o buyer ID apenas pra gente poder pegar o ID do investidor
de forma correta aí tem o ID Med da transação que ele fez a quantidade o preço e a data ele não tá enviando né poderia ser uma atualização que o ele poderia fazer a gente poderia fazer lá no microsserviço para poder ser enviado para cá via Cica Né Aí fica como uma melhoria um refinamento aqui pro nosso sistema a data ali da transação para que a gente passe essa data tá sendo usada lá para ver se o preço do ativo tem que ser atualizado né se a gente olha lá update de at se ele é
menor que a data da transação ali que é uma forma da gente verificar pronto então isso aqui está OK mas falta a parte quando eu estou criando uma nova Order aqui aí eu vou publicar lá no Tópico de input né É isso que a gente precisa fazer agora para poder finalizar o sistema então gerei uma nova ordem publico aqui Então eu preciso ter uma Instância do publisher ou do publicador do Cica tá a gente precisa gerar um serviço dessa Instância desse publicador esse serviço aqui é um serviço personalizado Existem várias formas de registrar um serviço
no nest então eh a gente vai usar aqui esse Cica Lib que é a Lib que nós instalamos Tá aí eu faço Import aqui em cima exatamente dessa forma tô pegando tudo do do confluent Inc JavaScript client e passando aqui para essa variável então eu Gero aqui uma Instância Inclusive a até um detalhe que eu não tinha comentado né a confluente ela fez uma um contrato para poder ser compatível com o CFC JS contrato nesse caso que você vai encontrar as interfaces e as coisas dessa Lib e idênticas ao CFC GS Então estou utilizando aqui
porque fica até mais fácil aqui a gente gera essa Instância tá aí eu vou precisar fazer uma mudança agora no meu serviço porque aquela lei é Instância do CFC mas quando o meu serviço iniciar junto com a aplicação eu quero pegar a Instância do producer que ela é gerada depois então eu posso pedir pro meu serviço implementar aqui on mod init isso vai fazer com que a gente Tenha que implementar aqui o Mod init Vou colocar aqui E aí em cima eh coloco Private Cica producer e a gente importa de novo aquela Lib daquela forma
Então coloca assim CFC Lib e CFC JS producer ponto producer aí quando a nossa aplicação iniciar esse aqui é disparado né quando o n faz os carregamentos dos módulos eu pego o meu Cica producer e falo que é igual ao meu Cica inst que eu vou Declarar ali no Construtor P produa então aqui em cima a gente vai criar Cica inst que vai ser quase isso aqui mas aqui no final vai ser apenas Cica aqui é Gero a Instância do meu produtor mas eu preciso pedir para ele se conectar e se habilitar lá no Cica
então aqui eu faço Connection uma vez que eu tenho o connect na mão vou chegar aqui no Create vai mudar Agora como que as coisas vão funcionar então aqui eu vou armazenar a Order que eh foi criada E aí nós vamos fazer a publicação dessa forma aqui ó eu chamo o meu producer faço um send passo qual é o tópico e aí eu posso publicar várias mensagens né por isso que eu ten um Array aqui mas eu vou publicar apenas uma mensagem por isso que só tem esse objeto aí eu passo o valor da mensagem
que é um json string Wifi para poder fazer toda a conversão né E aqui na verdade é ID e aqui é ID dessa forma aqui ela até não é necessária Mas a gente pode sempre e colocar alguma coisa na aqui que ela serve para poder identificar aquela mensagem ali que aconteceu né aqui também eu poderia mudar o formato dela se eu quisesse colocando um event Order created que eu posso ter vários eventos na Order né seriam outras melhorias que eu poderia acrescentar também então eu Ten o await aqui que vai esperar ele fazer a publicação
a gente faz aqui o retorno da Order depois então toda vez que eu crio uma Order agora eu vou publicar no Cica e aqui a gente fecha agora bom pessoal terminamos agora temos que testar né Vamos começar rodando aqui o goang então eu vou fazer um trade main.go ele já vai estar ouvindo lá o tópico de input nós podemos fazer um teste aqui Direto da própria api né como eu tenho banco zerado Então até outro detalhe Agora eu tenho que resolver problemas de JavaScript aqui né que que ele tá dando de Zica tá faltando trade
schema aqui n também colocar ele aqui embaixo Aqui trade trade Skin não tinha declarado ele aqui Né que eu tô rodando com a Instância do Consumidor aí agora ele tá chiando aqui que eu não acho que eu não importei esse Wallet document aí pronto admir os errinhos aqui se restou um errinho de ex lente aqui um é é são poucos né são detalhes que depois a gente ajusta pronto então olha só eu tenho que ter o consum aqui eu tem o mongo né mongo rodando eh e aí vem aqui o http melhor pera aí aqui
é o Consumidor e agora o rodo o http separado Então somente Run start Dev tá vendo ó Ele criou o consumidor agora vamos criar o ativo Eh vamos fazer um criar o Cadê o negócio de criar Wallet aqui aí eu tenho que pensar se eu criar aqui o de compra vou ter que criar tem essa Wallet aqui é bom adicionar uma quantidade nessa Wallet Então falo assim estou vendendo tá vendo que demorou um pouquinho agora porque antes era bem rápido agora Ele publicou no CF Então a primeira é a de venda vamos verificar aqui se
ela chegou ó ela aqui Maravilha tá ali céu e tudo mais então Eh eu vou criar agora uma outra Wallet aí eu não tenho nenhum ativo nela aí falo que eu tô comprando colocar o mesmo preço para o Teste poder ficar fácil aqui né pronto aí vamos ver se a nossa outra orda chegou aqui também não tá mostrando ali Vamos colocar posso colocar aqui ó set z0 aí tenho aqui então a última que foi de buy e a primeira que foi de sell Então já vamos verificar se aqui em output eu tenho já resposta tá
Vendo essa primeira aqui foi que a gente tinha publicado né mas aí ele gerou as duas transações ó H transação tanto de venda quanto de compra elas estão closed e nós temos ali a transação porque foi só uma transação já fe eh consumiu toda a quantidade de ações agora o que eu tenho que ver aqui no meu log do consumer se eh deu certo ó a princípio não deu erro vamos verificar Com a extensão do próprio mongo aqui que é bem mais fácil né de verificar aqui se eu tenho trades Ó lá ele criou os
dois trades pra gente eu tenho que ter dois wallets assets Ó que legal tá vendo a versão do documento agora tá um e o outro tá zero Esse aqui foi o que criou que é pra carteira que comprou já o outro que foi atualizado tá vendo que diminuiu 10 a gente tá comprando então a versão do documento Mudou para um paraa gente poder ter aquele travamento ó Então já funcionou essa parte aqui eu tô fazendo um um teste mais simples para ver se tá OK agora eh eu quero colocar aqui algo pra gente poder fazer
uma simulação bacana e ver lá no frontend quero criar aqui um simulador para que a gente vá fazendo orders vai gerando compras vai atualizando o preço e a gente veja o gráfico mudando vai ser bem legal ver tudo isso Funcionando então eu vou gerar aqui um comando com uma biblioteca chamada de nest Commander nest Commander né uma Lib para poder gerar comandos aqui com nest aí aqui na raiz da pasta source Vamos colocar aqui um arquiv Minho Colocar assim simulate assets TR Price com.ts tá aí eu vou alinhar tudo aqui aí o que que esse
comando vai fazer um comando Vai ser uma classe que vai ter esse a gente vai chamar ele dessa forma lá no terminal e nós vamos ter uma lista dos ativos Então olha só Amazon Sales Force Google com todas as informações e a apontamento ali da imagem em questão vai ficar bem bacana E aí nós vamos ter duas wallets que vão ser criadas tá então na hora de fazer aqui a execução do comando eu tenho serviço de asset serviço de Serviço de orders a conexão do Mongo e esse inquire service aqui que serve para nosso comando
fazer perguntas ali para poder ficar mais fácil de trabalhar então quando o comando roda começar aqui ó ele vai limpar o banco de dados ele vai em cada coleção a gente tá fazendo um delete M deixar tudo limpinho então ele pega todos os esquemas ali e sair limpando aí ele vai criar os ativos cria as duas Wallet e depois ele vai criar os ativos paraas Carteiras ele adiciona aqui um ativo na carteira um na carteira um e dois ativos na carteira número dois tá E aí vai ter a criação das orders nós vamos fazer aqui
a geração de 100 orders que elas vão sendo executadas uma após a outra né Aí tem como brincar bastante com isso aqui criar mais ordens paralelas aqui eu coloquei até a sequencial então ó eh para cada uma das Posições do for eu vou fazendo um Create Order aí ele mostra lá que criou então eu tenho aqui a primeira de venda depois a de compra aí eu faço um slip de 2 segundos e aí eu tenho uma informação que na hora que eu for digitar o comando tem que passar se eu quero que já Gere ali
o fechamento da Order né se eu quero que gere ele vai fazer o Create trade Que A Gente Tá acessando diretamente ali porque às vezes eu não quero testar Com Cica então eu posso habilitar essa opção agora se eu quiser testar com Cica é só falar que eu não quero que gere as ordens de fechamento obviamente vai desencadear já no fechamento na verdade aqui eu preciso corrigir isso aqui né Eh esse Order ID aqui Aqui tá certo é só por conta da tipagem que ele tá chiando mas maravilha então com isso aqui feito eu Vou
precisar criar um novo módulo aqui que é o módulo de comando Eu não vou usar o App tá para não colidir porque a gente tá fazendo esse simulador né simulador apenas para testes então a gente gera um novo Command mod passa ele é uma cópia do MOD mas com a diferença é que ele vai ter lá o simulate asset price e os dois confirmador de como que a gente vai gerar as orders Tá outra coisa também que nós podemos fazer poder ficar mais fácil é na hora deod aqui o comando eu vou adicionar isso aqui
ó porque para poder rodar o comando eu vou fazer npm install start com o entry file Command apontando pro comando específico tá na verdade isso aqui já tá usando uma versão direta de o start né ele não fica olhando ele não fica fazendo o rebuild Então é bom Forçar um rebild antes na pasta ter o comando aqui no momento eu até tenho por conta do start Dev né já compilou e mandou para cá mas show de bola já me esquecendo aqui de um último arquivo que precisa porque aqui é o comand Mod né ele vai
só organizar que vai ser preciso para poder carregar que tudo é módulo no n eu preciso de um comand TS ele é um tipo um tipo de Main que eu tô Fazendo aqui Bootstrap eu chamo Command de mod habilito quais é os loggers que podem ser mostrados aqui eu posso controlar esses níveis né e faço aqui o Bootstrap Então esse package Jon com o Command esse Command é exatamente é igual o kafica Command a gente tá criando um arquivo para poder ser executado diretamente eh se eu quiser assistir ele ficar o o problema é que
o comando Fica rodando toda a hora né não é bom colocar aqui o start Dev mas lembre-se de manter pelo menos o start Dev com http porque ele vai sempre compilando e mandando aqui pra pasta dis as atualizações eh eu fiz aqui uma execução antes para ver se tava tudo OK eu identifiquei alguns erros em questão aqui de métodos e e etc porque eu tinha uma outra versão disso aqui aí eu já fiz as correções né claro que você vai pegar o código o fonte disso aqui no Repositório tá então eu faço aqui o npm
Run Command mais o simulate assets price vamos aguardar ó eh aí ele tá dando aqui erro no asset service aqui no mod obv eu não coloquei aqui o aqui eu tenho que colocar exports exports asset Serv para que ele seja usado lá beleza aí como eu tô com Start Dev no Outro da mudança que eu faço ele já compilou também aí eu vou precisar fazer a ver se ele deu erro aqui vou precisar expor deixa eu dar uma olhada quais os serviços que ele tá usando Wallet e o de orders então aqui no módulo faço
exports Wallet service e o de orders também a mesma coisa e aqui embaixo Exports Order set pronto aí aqui que ele vai fazer a pergunta eh eu já quero gerar as ordens de compra e venda porque aqui se eu parar aqui fazer um Crol C ou colocar não ele vai ter gerado Apenas os ativos tá vendo ó ah mas um Sales Force coca-cola NVIDIA tal e as duas carteiras Se eu colocar no termina ou tem alguma coisa ainda que eu tenha que fazer depois eu dou uma Olhadinha se ele tá fechando corretamente Mas eu posso
rodar toda vez ele limpa o banco de dados né E aí eu posso gerar minhas ordens aqui mas o legal disso é que chegando aqui no next agora eu vou até rodar ele aqui novamente na verdade agora tenho que rodar na porta 3001 né 3001 se eu ficar parado ali esperando por exemplo coloca aqui local na porta 3001 não gerou as orders ainda eu já posso deixar aberto aqui né com a carteira específica e etc Eu acho que eu fiz algum npm inst em algum momento aqui da da minha aplicação Deixa eu fazer aqui o
npm instal algumas libs que não estão constando beleza vamos rodar aqui a nossa aplicação o socket client também parece que não tá presente então Vamos lá e o bom quando eu rodo ali ol ele vai qualquer lugar que eu acessar n ele não vai encontrar carteira ou se eu não passar nada eu já pego aqui e coloco por exemplo a primeira carteira eu tenho aqui o ativo Posso duplicar ver aqui os ativos fica bem legal agora não tenho nenhuma ordem específica se eu não me engano eu acho que o o simulador ali trabalha com ativo
da Amazon aqui então não tenho nada a Princípio né então voltando para cá eu quero começar a Gerar as ordens coloco y e ele vai perguntar se eu quero fazer as ordens de fechamento né não quero fazer as ordens de fecho porque com tudo aqui já integrado essas ordens vão ser fechadas automaticamente pela questão do CFC Então a gente vai começar a consumir aqui as informações e olha só a gente já tá recebendo que está recebendo está né Agora esse 00 que tá aqui vamos verificar o price que ele tá chegando zero por algum motivo
eu devo ter errado em passar alguma coisa mas as informações já estão chegando o que vai acontecer com esse simulador também é que nós vamos aumentando o preço a cada interação Então você vai poder ver aqui ó que eh para cada índice aqui da interação a gente vai somando aqui o price então eu tenho tento sempre Vender um pouquinho mais caro do que eu estava vendendo antes aí o outro acaba comprando mais caro apenas para poder ficar fácil aqui essa simulação tá então é isso que tá acontecendo afinal das contas tenho Price aqui eu vou
verificar exatamente o que tá acontecendo mas a princípio quando roda aqui o comando né ele tá deveria subir os preços e tem um detalhe na verade que eu tava esquecendo Olha só qual era o problema Tá vendo a linha verde o preço não tava sendo passado no na Order aqui na hora que eu pegava ela pegava undefined e o Jon stream Wii Desconsidera por padrão undefined ele não tava indo por isso que eu vi estranho aqui que o input não ia com o pric maravilha então agora olha só a gente pode parar aqui o comando
até acho que eu não coloquei um close ali por isso que ele não para mas com Control c para parar Então ele reseta tudo isso fica fácil aqui no front se eu atualizar ó aí eu acesso aqui a carteira pua iso para cá acessa a carteira de novo e coloca aqui a compra e venda da Amazon Então eu quero que ele Gere as ordens coloco y e Ordem de fechamento não que vai ser pelo próprio Cica aí ó olha que legal Dá para poder mudar os tempos e ver o gráfico obviamente o gráfico não Vai
ficar louco né não se que seja uma criptomoeda né Essas criptomoedas aí tem algumas que são criadas ali tem um Bump ela sobe absurdamente no alguns minutos depois vem a zero né mas a gente tá recebendo aqui todos os eventos a cada vez recebe novos e o gráfico tá mudando agora o preço aqui tá tendo alteração agora o preço esses r$ 1 aqui que nós não mudamos né is que eu tava vendo aqui Vamos pegar é o preço aqui eu tenho um componente que eu vou incluir já tenho ele pronto que é o asset price
ele pode até ficar aqui dentro ele vai usar lá aquele Store que nós tínhamos criado na aula como é que eu coloquei use asset Store eu tinha criado lá na terceira aula de Websockets então aqui eu só passo ali o ativo aqui vira asset Price passando o asset aí Prontinho agora vamos recarregar aqui o comando ainda tá rolando já tá ali em 165 agora ele deveria atualizar Exatamente porque a gente colocou aqui e aí o Store verifica aqui questão do símbolo Eu pego tento pegar o ativo do Store se ele existiu pego o preço dele
senão o preço da propriedade que eu passei ele tá subindo ali para um 82 tem algum detalhe faltando é claro que não ia funcionar porque aqui na página da compra eu não tenho aquele asset Sync né que ele captura a mudança do preço porque aqui eu só tenho o gráfico que tá capturando do diário do ativo então aqui Na página a gente pode chegar aqui no finalzinho colocar asset Sync a eu tenho que passar aqui os símbolos né que vai ser apenas o asset p sbol ele aceita vários mas a gente vai passar apenas um
Então pronto Tá vendo como que essa divisão de componentes clies e servers importante aí começamos Com 156 ali que tava e agora tá subindo né obviamente a bolsa de valores não seria assim eu não teria o ativo subindo de um em um eu faria um zigzag ou algo do tipo mas que eu tô fazendo só a gente poder ver todo funcionando né E aí tem as ordens também que tão sendo que são as ordens de venda porque eu tô com essa carteira eh lembrando para você poder usar outra carteira só limpar tudo aqui el vai
exigir que você acesse a outra aí ó tem Os ativos ali presentes aí tem as ordens de compra enfim a gente tem toda a aplicação aqui 100% funcionando agora pessoal eh eu quero dar as últimas dicas aqui porque foi um baita de um projeto que nós acabamos fazendo né projeto top demais eh eu vou criar um outro Branch colocando tudo com docker eu não vou mostrar aqui pra gente não alongar mais eu vou colocar o nestjs com o Docker também o Next com o docker e o golang aqui se o não tiver acrescentado vou colocar
também para permitir que a gente Rode tudo com os contêiners mas eu vou deixar essa opção de rodar é totalmente avul porque talvez a sua máquina eh consuma mais recursos e não seja adequado né os contêiners eles tendem a consumir um pouco mais de recursos também então você vai ver um outro bran lá para poder rodar tudo de Uma vez só tornando mais simples mas como que a gente poderia rodar qual que seria a em primeiro se roda o go lank depois o nest com mon E aí vem next essa seria a ordem recomendada porque
aí eu consigo fazer todos os testes e aí você tem o comando para poder brincar agora vem aqui dicas onde que eu poderia deixar isso eu vou dear na é um arquivo separado mas eu Só quero colocar ele aqui pra gente poder finalizar sobre colocar aqui eh melhorias e dicas melhorias Na verdade só a gente poderia fazer tudo isso aqui e aí vem com material de estudo riquíssimo para você poder evoluir validação das requests no caso aqui do Home Broker que a gente não tá fazendo validação com websocket também que a gente tá criando a
Order com websocket Autenticação na api e no next usar event driven para poder atualizar o saldo eh quando a gente cria um um service e tem uma operação desse tamanho igual temos o Create trade e a medida que ela vai mudando vai ter novas coisas aqui daqui a pouco tem notificação aqui também que eu vou enviar um e-mail pro usuário algo sei lá alguma coisa assim e a gente perde o controle né né se eu utilizar event driven aqui eu consigo separar as responsabilidades deixar que Aqui Fique somente a questão de crear o trade e
atualizar saldo eh criar aqui o da eles vão ser disparados via eventos tá seria bem legal fazer essa implementação também eh criar um evento do socket para atualizar o saldo do ativo na carteira aí você poderia criar um saldo também na carteira a pessoa faz um depósito e começa você fazer brincadeira a gente não trabalhou com isso né criar um notification no next mas websocket para Mostrar quando uma ordem foi executada porque a gente cria ali a ordem não fica assistindo ela tem que ficar fazendo F5 também poderia usar o websocket criar saldo na carteira
em reais que eu já tinha falado antes usar Cash do lado do servidor para consultar os artiv e ordens com Preço Fixo depois do horário do pregão do pregão né Eh depois do pregão eu já tinha comentado isso eu não precisaria ficar eh consultando a minha api eu poderia Diminuir o número de recursos utilizados evitar que websocket envie notificações se não houverem clientes também porque vamos supor que a gente tenha ã V pegar aqui o gate eu posso ver aqui a parte do server se eu não tenho clients Então não preciso ficar fazendo o emit
que é uso de recursos desnecessário também evitar que o usuário não pertencente às ordens eh eh se inscrever no websocket de notificação daquela ordem isso aqui Também faz parte de questão de autorização e e autenticação reprocessamento da finalização das ordens em caso de falha isso aqui seria muito legal tá eh eu tenho consumo esse de falha eu forço ele a consumir a mensagem novamente para poder reprocessar se for venda verificar que o saldo é suficiente uma vez que você tem o saldo ali e adicionar testes automatizados aqui tem uma bagagem assim para você poder ficar
Semanas estudando isso aqui mas se você implementar tudo isso poxa você vai ser um outro profissional você vai ter uma outra visão de programação então fica essas dicas aí como dever de casa para vocês então chegamos ao fim aqui da nossa jornada desse projeto incrível da imersão full cycle com esse home broker vimos como que é complexo desenvolver esse tipo de aplicação imagine cada empresa aí de sistema financeiro o quão mais coisas não podem ter e nós vimos Ali uma listinha de algumas coisas que podem ser acrescentadas Eu espero que você vá além porque isso
vai te fazer evoluir bastante e é isso que a fso está empenhada né de tornar profissionais extremamente qualificados para poder lidar com esses tipos de projetos Então pega o código fonte pratique bastante eu tenho certeza que você vai evoluir muito espero que você esteja curtindo o evento porque ele ainda tem mais algumas outras coisas acontecendo né continue Acompanhando os nossos canais agradeço muito mais uma vez todo o feedback de vocês e o apoio e a gente se V em próximos eventos até mais pessoal tchau [Música]