Olá pessoal, eu me chamo Ronaldo Lanielas e nessa aula a gente vai ver como fazer a produção de uma mensagem no Kafka usando a linguagem Golang. Nas aulas passadas a gente viu como subir o Kafka usando o Docker. Então aqui eu estou compartilhando o meu terminal e eu já subi o Kafka, então ele está rodando, uso o Kitter, o Kafka e o AKHQ, que é a interface gráfica, certo? Então se eu vier aqui na porta 8080, a gente vai conseguir ver a interface gráfica, ok? Com todos os tópicos que existem, etc., como foi explicado nas aulas anteriores. todos os tópicos que existem, etc, como foi explicado nas aulas anteriores. Agora a gente vai ver como produzir uma mensagem aqui usando uma aplicação de exemplo. Então essa aplicação está no GitHub, aqui o link dela. Esse link vai estar também na descrição do vídeo, então não se preocupem. Aqui, para rodar a aplicação é muito simples basta você baixar da uniclone e rodar com gol run main.gol automaticamente a mensagem vai ser produzida no seu kafka óbvio você tem que estar rodando kafka no seu docker compose bom vamos para o código e eu explico como é que funciona. Essa não é uma aula de Go. Eu vou explicar algumas coisas como funciona no Go, mas eu estou partindo do princípio que você já tem conhecimentos básicos de Go, por exemplo, como declarar uma variável, uma função, como usar o package manager do Go, etc. Se você não conhece Go, recomendo que você dê uma olhada em alguma aula de Go, pelo menos o básico, para poder conseguir entender o código com mais facilidade. Mas também, se você não quiser aprender Go, pelo menos você vai entender aqui nessa aula como que o produtor funciona em Kafka, porque em todas as linguagens a lógica é a mesma, só muda a sintaxe. Então a primeira coisa que a gente tem que fazer, nesse caso, a gente está usando uma lib da confluent chamada confluent kafka go então no caso do golang a gente usando o package manager do golang eu estou fazendo o link direto a lib do github deixa eu só tirar aqui então essa é a lib que a gente está usando existem outras de mercado mas essa é a lib que a gente está usando, existem outras de mercado, mas essa é a lib que a gente vai utilizar. Se vocês lembrarem, nas aulas passadas eu comentei um pouco sobre Libs in Go, Python, .NETs usam um driver em C chamado chamado librd Kafka. E a mesma coisa aqui, essa lib, pt and go, internamente ela usa essa lib em C chamada librd Kafka, que é quem faz realmente a comunicação com Kafka. Bom, mas a gente não vai tocar nessa parte baixo nível aqui, vai ser muito mais simples. Então, a primeira coisa que tem que ser feita é a configuração do produtor, que é toda essa seção. O que é configurar o produtor? É dizer primeiramente qual que é o broker, qual que é o URL de conexão ao broker, nesse meu caso é o localhost. Por padrão, como a gente não colocou porta aqui, ele vai entender que é a porta 9092. E se vocês lembrarem, na aula passada, a gente deixou na porta 9092. Está aqui, 9092. Certo? Então aqui eu estou criando um objeto chamado config, que vai manter a configuração do Kafka. Se vocês olharem aqui no autocomplete, esse cara não vai me mostrar, mas o que a gente pode fazer para ver todas as configurações que você pode colocar aqui? Como eu falei, a gente está usando uma lib chamada librdkafka por trás dos planos. Então essa librdkafka tem n configurações que você pode colocar. A gente vai ver em outras aulas um pouco mais da parte de tuning, mas por exemplo, client id, que é o ID do produtor Bootstrap server que é o que a gente está usando o máximo de cada mensagem e assim por diante. Então tem muita configuração aqui. Uma dica que eu dou para vocês é vocês olharem aqui no header, na coluna, ele tem esse CP. Esse CP significa consumidor e produtor. Então, quando tem um aterisco, significa que essa configuração serve tanto para produtor como para consumidor. Se a gente descer um pouco, você vai ver que começa a aparecer configuração que só faz sentido para consumidor. Por exemplo, enable auto-commit, que a gente vai ver quando estiver trabalhando com consumidor, só faz sentido para quem está comitando, para quem é consumidor. E se a gente descer um pouco mais, eu tenho a parte de produção. Mesma coisa. Algumas coisas aqui só fazem sentido quando você é um produtor. Então voltando aqui, para efeito demonstrativo aqui bem simples, a gente vai só colocar o URL do broker e usar todas as outras configurações de default. Bom, dito isso, com essa configuração eu crio realmente o produtor. Então eu dou um new producer que vai criar o meu produtor. Por padrão esse método ele retorna o produtor e o erro. Se eu tiver qualquer erro eu vou dar um panic. O que é esse panic? Eu simplesmente vou encerrar minha aplicação. Tá. É como se fosse um exit. Então estou dando um exit diferente de sucesso aqui e a aplicação está sendo encerrada, com erro obviamente. É óbvio, aqui é um exemplo, a gente está simplesmente fazendo a produção e acabando a aplicação, mas no caso real você vai ficar produzindo lá, enfim, forever, então nesse, você não vai dar um panic. Quando o produtor dá erro. Você vai tratar com log de erro. Métrica, etc. Esse defer.produce.close. O que é esse cara? No goleng. Você pode dizer para ele fechar. Aquele objeto. Encerrar aquele objeto, vamos dizer assim, no final do método. Então, no final do método main, ele vai chamar esse defer producer.close, que seria mais ou menos como se eu estivesse pegando esse cara e colocando aqui no final. E por que você não coloca no final? Enfim, porque eu posso ter depois um milhão de códigos, etc. Para eu não esquecer de fechar, é uma boa prática você sempre usar o defer. Porque o próprio Golang vai garantir para você que no final daquela execução, ele vai chamar o ponto close. E o ponto close vai fechar o produtor. Então, essa seção que você tem aberta com Kafka de produção, você vai fechar ela. Enfim, qualquer conexão que estiver aberta vai ser encerrada. E aí você economiza recursos do SEO, etc. Bom, dito isso, a gente vai realmente produzir a mensagem agora. Para produzir a mensagem, eu preciso do nome do tópico. Óbvio, né? E da mensagem. Eu vou colocar um outro tópico aqui. Vou colocar o tópico Ronaldo. Porque, se vocês olharem, eu já tenho um tópico de teste. Então, eu coloquei Ronaldo. A mensagem vai ser oi e a chave vou colocar 001 ok então a mensagem ela possui lembra que eu falei o que que contém uma mensagem no Kafka? Ela contém valor, chave e headers. Aqui a gente não está usando headers, mas se você quisesse também, você tem a opção de colocar uma lista de headers. Eu vou colocar uns aqui só para você ver. Então, o header é mais trupe, que tem uma key e um value. Então vamos colocar aqui. Então aqui eu vou chamar de região. E o value eu vou colocar SP. Pronto. Então eu criei um header bem simples aqui. E o tópico partition, ele nada mais é do que uma estrutura do Golang para dizer para qual tópico vai ser gravado. Nesse caso você tem a opção de colocar o tópico que você vai gravar e a partição. Uma boa prática é você colocar o N, porque o Kafka, através daquele cálculo de hash que eu expliquei nas aulas passadas, ele vai decidir para onde vai a mensagem, eu quero dizer qual é a partição. Se você colocar uma partição específica aqui, enfim, colocar um 0, 1, etc., o Kafka vai ignorar aquele cálculo de hash que eu expliquei de balanceamento etc e vai usar o que você colocou. O que talvez para o seu negócio faça sentido, mas em 90% dos casos não faz. Eu quero dizer que 90% das vezes você vai deixar o cálculo escolher qual é a partição correta. E é por isso que a gente usa o partition n. Por isso que a gente usa o partition n. Ok. Essa é a parte tranquila. A gente está criando o tópico, criando a mensagem. E tem uma parte um pouco mais complicada. Que não é tão complicada assim, mas é um pouco mais complicada. Que é assim. Na hora que você vai produzir a mensagem. Esse producer, por padrão, ele é assíncrono. O que significa? Significa que se você só chamar Producer, que é o producer que você criou aqui em cima Ponto Produz A mensagem que você criou Né? E não passar nada aqui Bom, ele vai simplesmente mandar a mensagem Mas não vai ter retorno, ou seja Pode ser que essa mensagem não tenha ido Pode ser que tenha ido, enfim, a gente não sabe. Então, o que a gente cria aqui? No Golang, a gente tem o conceito de channel. Aqui nesse caso, eu não vou entrar em detalhes o que é um channel, etc. Como eu falei, aqui não é aula de Golang, mas o channel vai servir aqui para a gente esperar o retorno do Kafka de acordo com aquela mensagem. Então, ela foi gravada, não foi, deu algum erro, etc. Então, nesse caso, eu crio esse channel. Então, eu estou criando aqui esse channel que é do tipo Kafka Event, que é o evento que eu estou esperando. tipo Kafka Event, que é o evento que eu estou esperando. Mando produzir e digo para esse método que ele tem que mandar o retorno para esse wait aqui, que é um channel. Então, quando a mensagem for produzida, ele vai mandar o retorno para esse wait. Ok? Se der algum erro antes de ele mandar a mensagem, então, imagina, configurei o broker errado, meu config neto está errado, enfim. Qualquer coisa errada antes de ele mandar a mensagem, ele já vai mandar um erro aqui e eu dou um panic na aplicação de novo. Mas de novo, aqui a mensagem ainda nem foi enviada. Aqui ele vai tentar enviar a mensagem, imagina que deu algum erro antes mesmo da mensagem enviar ele já vai retornar esse erro porém se retornar um erro se acontecer um erro durante então a gente mandou a mensagem a mensagem não por algum motivo não chegou no broker o broker caiu no meio a gente não vai ter o retorno do wait. Porque o wait é esse cara que está blocando essa thread até eu ter o retorno da mensagem. Então, esse sinal aqui de menor com um traço, significa que ele vai dar um block nessa linha até a mensagem chegar. Então ele só vai passar por essa linha aqui, para a next line, quando a mensagem chegar. Vamos depurar para a gente ver o que acontece. E aí eu já expliquei o código todo. A gente passa rapidamente aqui. Para entender o que ele está criando. E ver isso acontecendo. Compilando aqui... A máquina está um pouco mais lenta do que eu gostaria hoje, mas já já ele termina. Bom, foi. Então, a gente olha aqui no breakpoint. Vamos lá. Config criada. Produtor criado. Não tem nenhum erro. Sembrado de fé, utópico. A chave.ave estou criando ok criando headers criando o tópico dentro da mensagem vamos dar uma olhada aqui dentro da mensagem. Vamos dar uma olhada aqui na nossa mensagem só para a gente ver como ela está estruturada. Como eu falei, a gente tem aqui o valor, que é o oi. Tem aqui a chave. Timestamp. Como não preenchi nada, deixei zerado por padrão, mas depois o Kafka vai preencher isso aqui. headers, que são headers com valor sp, e a partição vai cair no n. Você pode se perguntar, mas você não colocou n? Por que está menos 1? O n na verdade aqui são o alias para o "-1". Então se você passar o mouse aqui, como você pode perceber, na verdade é uma variável que no final das contas é "-1". O que vai dizer para o Kafka que você quer que ele escolha a partição. Bom, criei meu channel e amanei para o Z. Legal, nãou nenhum erro. Aqui, você vai perceber que é tão rápido, porque está local, etc. Enfim, a mensagem já foi produzida, com certeza. Eu já posso passar aqui. E ele foi para a linha 36, ou seja, a mensagem já chegou. Então, eu vou dar um play aqui. E a aplicação finalizou sem erro. Existe code zero. Se eu der um refresh, está aqui a mensagem, Ronaldo, uma mensagem. Deixa eu abrir aqui. Então, eu tenho a chave, o header região, com o valor SP, e a mensagem é oi. Então, muito simples. Lembra que eu falei para vocês que essa é uma aplicação que sobe e manda mensagem e é destruída. Então se eu mandar dar um play sem debug, você vai perceber que ela vai simplesmente rodar. Vou fazer até melhor vou dar um go seguido o exemplo do readme go run main.go automaticamente ele vai executar o main.go e vai encerrar, então já foi como eu acabei de mandar duas mensagens deve ter três agora três mensagens e assim sucessivamente é isso pessoal espero que vocês tenham gostado até a próxima