Olá pessoal, me chamo Rolando Lanielas e nessa aula a gente vai falar sobre estratégias de commit e seek. Então, vamos lá. Para começar, a gente precisa entender o que é um offset. Então, um offset nada mais é do que um número sequencial que vai identificar a posição daquela mensagem no tópico barra partição. Então se a gente olhar aqui nesse desenho, a gente tem um tópico A e aqui essa é uma partição do tópico A, nesse caso aqui é a partição 0, que você pode estar olhando aqui. A primeira mensagem, ela é a mensagem 0, a segunda mensagem é a mensagem 1, e assim vai. Então, a gente tem aqui 1330 e assim por diante. Então, cada posição dessa a gente chama de offset, tá? E ela vai incrementando conforme novas mensagens vão chegando. Olhando para a mensagem 2 aqui, o que a gente tem? A gente tem a chave hello, a gente tem um valor, um JSON, a partição é a 0, como eu falei, e o offset é 2. Com essas informações aqui, eu consigo identificar exatamente a localização da mensagem. Na verdade, apenas com a partição e o offset, eu consigo identificar a localização da mensagem. Lembrando que para a mesma partição, você não vai ter duplicação de offset, mas você pode ter offset 2 para a partição 1, para a partição 2, para a partição 3, e assim por diante. E aí entendendo o que é offset, dá pra gente entender agora o que é o commit. Então o commit na verdade é uma marcação. Uma marcação do que? Do consumer group. Se vocês olharem as últimas aulas, a gente falou um pouco sobre Consumer Group, Consumer Client. A marcação acontece no nível do Consumer Group. E aí, essa marcação diz qual foi o último offset lido. Então, vamos olhar aqui de novo o tópico A, partição 0 nesse caso. Esse tópico tem dois consumers, consumer B e o consumer A. E aí o consumer A foi lá e comitou no offset 200. Então ele criou essa marcação dizendo que a última mensagem que ele leu foi na posição 200 da partição 0. Essa informação é gravada nesse tópico chamado Consumer Offset. Então, é como se fosse o Kafka... Enfim, tudo que a gente grava no Kafka, inclusive coisas internas do próprio Kafka, são gravadas no próprio Kafka. O Kafka não usa nenhuma base externa ou algo do tipo. E nesse caso, a própria informação de commit do consumer é gravada no ConsumerOffset. O ConsumerB também está gravando no ConsumerOffset. Aqui está errado, mas é a partição 0 e o offset é o offset 1, não é 200 não. Então o Consumer B está gravando em uma outra posição. Significa que se o Consumer B, os consumidores que estão dentro do Consumer Group B caírem ou subirem o novo consumidor, eles vão começar da posição 1, na partição 0. E aí a gente tem a commit. Acabei de falar o que é commit, como funciona, a marcação. A gente tem formas de fazer esse commit. A mais comum é o chamado auto commit. Praticamente em todas as linguagens que você pegar, Java, Golang, Python, .NET, o auto commit vem habilitado. O que é isso? Quando você recebe uma mensagem, então você tem lá sua aplicação em Golang rodando, consumindo do Kafka. E aí você recebe uma mensagem de offset 100. Automaticamente, sem você fazer nada, essa mensagem é comitada. Então, assim, é feita aquela marcação que eu falei de que a última posição unida foi a posição 100. E aí você faz o processamento do que você tem que fazer. Imagina, você tem que salvar na base e acontece um erro. Você, por algum motivo, não consegue salvar na base, a base está fora, enfim. Nesse caso, você perdeu a mensagem. Por quê? Você já comitou ela. Quando você comita a mensagem, você está dizendo para o carta que você já leu aquela mensagem. Então, a próxima mensagem que ele vai te entregar não é mais a 100, é a 101. E nesse caso, você perdeu a mensagem. Então, o autocomite, é muito importante deixar claro aqui que 90% dos casos você não vai usar autocomite. Só em casos onde você não quer realmente, não liga para o que vai acontecer no processamento, ou seja, você tem um esquema de fire and forget. Imagina que você está recebendo mensagem de log e aí tanto faz se salvou na base ou não, salvou no Elasticsearch ou em outro lugar. Você pode perder a mensagem. Se você pode perder a mensagem, é legal você usar o commit porque ele é muito performático. Nas estratégias essa é uma das mais rápidas. Então é uma boa estratégia quando você pode perder a mensagem. Mas aí, como eu falei, em 99% dos casos, você vai usar o commit manual. E funciona assim, tipo, você recebe a mensagem, você processa a mensagem, então, assim, você vai tentar salvar na base, se der algum erro, você não vai comitar, o que significa que o Kafka vai te entregar a mesma mensagem de novo, mas se acontecer tudo certo, você vai fazer o commit apenas depois do processamento. Então aqui você moveu o commit que estava sendo feito no início para o final do seu processamento para garantir que você não vai perder aquela mensagem e caso algo errado aconteça você vai receber a mesma mensagem novamente. Eu estou falando de teoria aqui, primeiro explicando o que é o commit manual, commit automático, mas quando a gente for entrar no hands-on, eu vou mostrar na prática isso acontecendo. Tanto commit manual como o commit manual, como o commit automático, enfim, como o offset funciona e tudo mais, tá? A gente tem uma outra propriedade do consumer que ela é muito importante, que é o auto-offset reset, tá? O que é isso? Imagina que você tem um tópico que ele tem 401 mensagens, tá? Então, você tem um consumer group, que tem alguns consumidores lá. E aí, você enfim, tem 401 mensagens, está se reproduzindo e etc. Aí você resolveu criar um outro consumer group. Consumer group totalmente novo. O que você quer fazer quando você criar um novo consumer group? Você group totalmente novo. O que você quer fazer quando você criar um novo consumer group? Você quer ler desde a mensagem zero até a 401. Então, assim, pode ser mensagem de um ano lá, né? Você quer ler todas as mensagens que já estavam no tópico ou você quer desprezar as mensagens que estavam no tópico e começar a ler só as novas que vão chegar. Bom, se você quiser ler tudo, você vai usar o modo Earlist. Então existe uma configuração no seu consumidor que você coloca o modo de leitura. E nesse caso você pode usar Earlist. Quando o seu consumidor subir pela primeira vez, ele vai ler todas as mensagens que existem no tópico de novo, só se você nunca leu nenhuma mensagem então se você nunca cometeu nenhuma mensagem no commit offset lá você vai ler todas as mensagens desde o início por outro lado, se você colocar o latest significa que você vai ler das novas mensagens em diante, então você vai ler das novas mensagens em diante. Então, você vai ler a 402, 403, as que forem chegando depois que você subir. Bom, e aí a gente tem uma estratégia chamada Seek. Se vocês lembrarem, em alguns slides anteriores eu falei assim, se você usar a estratégia de auto-commit, você vai perder mensagem. Eventualmente, porque você pode ter um erro de processamento, você já comitou e você não vai receber a mensagem de novo. Mas existe, na verdade, uma forma de você conseguir voltar ao offset. Você pode falar para o cápita o seguinte eu quero o tonoffset 100 eu quero voltar para o 20 porque eu quero ler aqui essas 80 mensagens de novo tá esse é o seek, o seek o que acontece é imagina que o seu consumidor ele está na posição 200 tá então tenho consumidor A, com a opção 0, que está comitado na posição 200. Então ele fisicamente escreveu esse offset 200 lá no consumidor A. Ok. E aí eu descobri que eu quero ler centenas de mensagens para trás. O que eu faço? Eu vou chamar esse comando de seek dizendo que eu quero agora mover o meu offset para a posição 3. Quando eu fizer isso, o Kafka vai me entregar todas as mensagens desde a 3, 4, 5 e assim por diante. Como se eu estivesse começando de novo. Então, esse seek é muito importante quando você quer, por exemplo, fazer uma estratégia de retry. Pensa numa situação real onde você recebeu uma mensagem que é a 200, passo 1, recebeu a mensagem 200, você tentou salvar no banco, passo 2, aconteceu algum erro no banco de dados e você não conseguiu salvar, o que você vai fazer? Você vai chamar o SIC dizendo para o Kafka que você quer que ele entregue de novo para você a posição 200. Então, nesse caso, o Kafka não vai para a 21. Ele vai te entregar de novo a posição 200, porque você está falando explicitamente para ele que você quer continuar a posição 200 porque você está falando explicitamente para ele que você quer continuar na posição 200 até dar certo. Então você vai ficar nesse loop aqui de 1 a 3, 1, 2 e 3, 1, 2 e 3 até dar certo. É óbvio, existem diversas estratégias, você pode ter um contador para depois de dez vezes você jogar num Dead Letter Kill, ou ficar eternamente, enfim. Existem diversas estratégias, aí é você que vai decidir como usar o SICK melhor. Mas o que eu quero dizer é que ele é muito utilizado, ele é mais utilizado na verdade, pra quando você quer fazer retry de uma mensagem que está com algum problema, tá? É isso pessoal, espero que vocês tenham gostado e até a próxima.