Olá, eu me chamo Ronaldo Laguelas e nessa aula eu vou mostrar como funcionam os algoritmos de distribuição quando a gente está falando de chaves, partições e tópicos. Nas aulas anteriores ficou bem claro para todo mundo como funciona um tópico, como funciona uma partição. E agora a gente vai aplicar aqui para entender como é que essa ordenação funciona, essa distribuição entre as partições corretas. Então primeiro, vamos entender que quando a gente fala de tópico, de novo, está muito claro para todo mundo o que é um tópico. E uma partição, que é realmente a divisão física de um tópico. E aí a gente tem o conceito daqui. Então, quando você está produzindo uma mensagem no Kafka, você tem... Eu já falei em aulas anteriores, mas vou relembrar aqui. A gente tem aqui o Velo e alguns headers. lembrar aqui, a gente tem aqui o value e alguns headers. Baseado na key, o Kafka vai escolher para qual partição a sua mensagem deve ser enviada. Então, aqui nesse exemplo, a gente tem uma key 001 e a mensagem que é hello, que no caso aqui é o value. tá? Esse cara aqui, ele está caindo na partição 0 do tópico A. Se eu mando uma outra mensagem, com outro payload, outro conteúdo, mas com a mesma partição 001, ele também vai cair no tópico A, na partição 0. Porque ele segue o mesmo princípio de se você está usando a mesma chave, ele vai cair sempre na mesma opção. Com isso você garante a ordenação. Vamos pensar que você tem, por exemplo, um débito e um crédito. Quando você tem um débito e um crédito aplicado para o mesmo cliente, vamos pensar que aqui é o CPF, nesse caso, quando você tem o débito e o crédito, esse débito, se ele for o primeiro, por exemplo, ele vai cair na partição 0, e o crédito vai cair na partição 0 também. Então você vai ter uma sequência de mensagens na mesma partição. Assim como se você também mudar a chave, aqui nesse caso eu coloquei 002, e coincidentemente eu coloquei a mesma mensagem da Q001, que é hello, essa segunda mensagem vai cair na partição 1. Aí tem um detalhe, tá? Aqui é só um exemplo. Então, para ficar mais fácil de entender, eu coloquei que aqui 001 vai cair na partição 0 e aqui 002 cai na partição 1. Mas não necessariamente nessa ordem. Então pode acontecer de aqui 002 cair também na partição 0. O que eu quero deixar claro é que assim. É garantido que aqui 002 vai permanecer na mesma partição. Ponto. Não quer dizer que vai ser uma partição diferente da Q001. As duas, tanto a Q001 como a Q002, elas podem cair na mesma partição. Mas elas vão permanecer lá até que algumas coisas aconteçam que eu vou explicar mais pra frente. Então, aqui eu falei no diálogo anterior, bem basicamente sobre o que é aqui. Que ela vai, enfim, o Kafka vai usar ela pra poder escolher qual é a partição. E como é que ele faz isso? Ele faz isso aplicando um algoritmo de hashing. O que é um algoritmo de hashing? O que é um algoritmo de hashing? Existem diversos algoritmos de hashing no mercado que pegam o conteúdo da sua mensagem, aplicam o algoritmo XPTO de hashing, que vai te dar um resultado diferente. Esse resultado vai dizer para qual partição a sua mensagem deve ir. Nesse caso, o Kafka usa um algoritmo chamado Murmur2, algoritmo um pouco antigo, mas muito performático. Se vocês derem uma gulgada, vocês vão ver que é um algoritmo altamente performático. E como é que ele funciona? De novo, dado o resultado do hash, eu até coloquei um exemplo aqui, então vamos pensar a mensagem, enfim, para o nosso caso a mensagem não é importante, porque a importante é aqui. Então o valor payload não é mais importante, a importante é aqui. Ele vai aplicar no moremore2, esse aqui, 001, então ele simplesmente passa como parâmetro para o moremore2 o 001. O moremore2 vai retornar um valor, enfim, um número hash misturado com letras, etc. O que é importante você entender que é uma sequência de alfanuméricos e subolizam o hash baseado nesse valor. Ele vai aplicar um módulo que o módulo aqui nada mais é que um resto, tá? Com a quantidade de partições. Certo? Então, vamos supor que aqui obviamente vai ser um valor numérico, né? Não alfanumérico. Porque se ele está fazendo um módulo, ele vai fazer um módulo num valor numérico. O módulo é o resto. Então é o resto de uma operação de divisão. Se tem quociente, etc. Porque na verdade a matemática aí, o módulo é o resto. Baseado na quantidade de partições. E aí sim ele vai te dar o hash. Então, de novo, moremore2 baseado na sua chave vai retornar um valor numérico, vai ser aplicado um módulo baseado na quantidade de partições em cima do valor que o moremore2 retornou para poder ser realmente o hash. Aí, baseado nesse hash, eu coloquei um número aleatório aqui, tá? 1, 2, 3, 4, 5, ele vai escolher para qual a partição que ele vai mandar, tá? Então, toda e qualquer mensagem que tiver a mesma chave, sempre vai dar o mesmo hash, concorda? Porque o valor é o mesmo 001 é baseado no number 2 e aí ele vai tirar o resto e vai cair na 0 vai cair na 0 só que tem um detalhe aqui não sei se vocês perceberam que é a quantidade de partições eu acho que eu falei em aulas passadas que a quantidade de partições quando você aumenta reduz, etc, ela causa rebalance. E também causa redistribuição de chaves nas partições. Porque ela faz parte do cálculo de hash. Então, se você mudar de 4 para 3, tanto diminuir, diminuir não é comum, né? Vamos falar de aumentar. Então, quando você aumenta o número de partições aqui, o seu hash vai mudar, porque o memoryur2 ele continua o mesmo, certo? Então sempre o murmur2 vai retornar o mesmo valor, porém o módulo do murmur2 baseado na quantidade de partições vai mudar, porque antes você tinha 4 e agora você tem 5 ou 10 partições, né? Então o hash vai mudar e aí o Kafka vai entender que tem que recalcular para qual partição ele tem que mandar. Então é muito importante principalmente por dois motivos. Rebalance e recálculo de hash em você não mudar o número de partições. A não ser que não tenha problema para você perder a ordenação de mensagens e sofrer rebalance. Lembre-se que se você aumentou o número de partições, esse cálculo de hash vai ser refeito e a sua mensagem que antes estava caindo em uma partição A vai cair em uma partição B. E aí você pode sofrer um pouco com ordenação, etc. Porque você vai ter por alguns milissegundos duas mensagens, por exemplo, de débito e crédito em partições separadas. E aí se você tiver duas aplicações consumindo, você pode consumir fora de ordem esse evento. Se você não tiver uma aqui, aleatoriamente o Kafka vai escolher para qual partição ele vai enviar. Existem até algumas discussões na internet sobre se o Kafka usa routing robin para fazer isso. Já foi provado no código do Kafka, até a versão, se não me engano, 2.4 ou 8, pode ser que já tenha mudado, que o Kafka não usa routing robin para fazer a escolha de partição quando não tem key, ele usa aleatório, random. Então nesse caso só tome muito cuidado no não uso de chaves porque ele vai usar uma aleatoriedade para escolher a partição e talvez isso não seja bom. Talvez acabe sobrecarregando uma partição específica. Então eu sempre aconselho quando você fazer modelagem de um tópico, você escolher uma partição, uma chave, desculpa, que faça sentido. Para você distribuir muito bem a carga de mensagens entre os tópicos. É isso, espero que vocês tenham gostado e até a próxima.