Valuable insights
1.Falha em Arquiteturas Síncronas: Arquiteturas de microsserviços que dependem de chamadas diretas e síncronas falham sob alta demanda, resultando em lentidão e perda de vendas.
2.Kafka como Intermediário Central: O Kafka funciona como um serviço de correio, desacoplando produtores de eventos de consumidores, garantindo que a comunicação seja assíncrona e resiliente.
3.Estrutura de Eventos e Tópicos: A informação é transmitida como eventos contendo pares chave-valor e metadados, organizados logicamente em tópicos específicos para cada fluxo de dados.
4.Papéis de Produtor e Consumidor: Produtores geram e entregam eventos ao Kafka, enquanto consumidores se inscrevem em tópicos para processar essas informações em segundo plano, sem esperar confirmação imediata.
5.Kafka Não Substitui Bancos de Dados: O Kafka facilita reações em cadeia e processamento em tempo real, mas não é um repositório de estado primário; ele complementa o banco de dados tradicional.
6.Processamento Contínuo com Stream API: A API de Streams possibilita a análise contínua de fluxos de dados, permitindo agregações e cálculos em tempo real, como validações de estoque ou localização de motoristas.
7.Escalabilidade Através de Partições: Partições dividem tópicos em unidades menores, permitindo que milhões de escritas e leituras sejam distribuídas, aumentando drasticamente a performance e a capacidade de escala.
8.Divisão de Carga com Grupos de Consumidores: Grupos de consumidores, identificados pelo atributo 'groupID', permitem que múltiplas instâncias de um serviço trabalhem em paralelo, consumindo diferentes partições do mesmo tópico.
9.Persistência de Eventos no Broker: Os brokers do Kafka salvam dados no disco e os replicam para tolerância a falhas, mantendo todos os eventos conforme uma política de retenção configurável.
10.Evolução da Coordenação com KRaft: Versões mais recentes do Kafka, a partir da 3.0, incorporam o KRaft, eliminando a necessidade de gerenciar o Zookeeper como uma dependência externa de coordenação.
Introdução ao Desafio dos Microsserviços
A construção de aplicações modernas, como um e-commerce com múltiplos microsserviços para pagamentos, pedidos e estoque, gera uma complexa cadeia de eventos. Quando um pedido é finalizado, uma reação em cascata é disparada, exigindo atualizações em diversos sistemas, como o envio de notificações, a geração de faturas e o registro de dados de vendas no dashboard.
O Colapso da Comunicação Direta
Em uma arquitetura inicial e simples, os microsserviços se comunicam diretamente, forçando uma dependência síncrona. Essa abordagem se torna um pesadelo quando o volume de tráfego aumenta drasticamente, como durante promoções de grande escala. A lentidão ou falha de um único serviço paralisa todo o processo de pedido, resultando em telas de carregamento para os usuários e perda imediata de receita.
- Acoplamento rígido entre os serviços, onde a queda de um congela o fluxo.
- Comunicação síncrona que cria um efeito dominó de lentidão.
- Pontos únicos de falha que causam grandes atrasos em processos cruciais, como o processamento de pedidos.
Nossa arquitetura que parecia limpa no quadro branco se torna um pesadelo.
A Solução: Um Fluxo em Esteira
Para resolver a instabilidade, a solução proposta é redesenhar o sistema para que os pedidos fluam como itens em uma esteira transportadora, e não como um jogo de batata quente. Isso é alcançado removendo o acoplamento direto e introduzindo uma ferramenta intermediária que atua como um broker, criando um espaço entre os serviços.
Conceitos Fundamentais do Apache Kafka
O Kafka assume o papel de um serviço de correio central. Em vez de os vendedores entregarem pacotes diretamente ao cliente, eles os entregam ao correio. Da mesma forma, o serviço de pedidos entrega um pacote, chamado evento, ao Kafka, informando que um pedido foi feito, e segue seu trabalho sem esperar pela confirmação de que as outras ações foram executadas.
Produtores e a Estrutura do Evento
Um evento possui uma estrutura simples, composta por um par chave-valor e metadados. O serviço que gera e envia esse evento ao Kafka é denominado produtor. Este produtor confia no broker para garantir a entrega correta às partes interessadas, liberando-o imediatamente da tarefa.
Organização de Eventos em Tópicos
Os eventos de diferentes produtores (como pedidos, pagamentos e estoque) não são despejados em um único local. Para manter a performance, o Kafka utiliza tópicos para agrupar eventos do mesmo tipo, como um tópico 'orders' ou um tópico 'payments'. O engenheiro define a estrutura desses tópicos, análogo à definição de um schema SQL.
Consumidores e Reações em Cadeia
No lado oposto, os consumidores são os microsserviços que se inscrevem nos tópicos de interesse. Quando um novo evento é adicionado, todos os consumidores inscritos são notificados pelo Kafka. Por exemplo, o serviço de notificação lê o evento de pedido para enviar um e-mail, enquanto o serviço de estoque atualiza o banco de dados e pode, por sua vez, gerar um novo evento para o tópico de inventário.
- Serviço de Notificação: Envia e-mail de confirmação ao cliente.
- Serviço de Inventário: Atualiza os estoques dos produtos vendidos no banco de dados.
- Serviço de Pagamento: Gera a fatura e a envia ao usuário.
Kafka: Complemento, Não Substituição de BD
A questão se o Kafka substitui um banco de dados é comum, visto que ele armazena dados como eventos e atualiza status. A resposta direta é negativa. O Kafka não é um repositório de estado primário, mas sim um facilitador de fluxos de trabalho complexos baseados em eventos.
Cadeias de Reação de Eventos
Um uso crucial reside na criação de reações em cadeia. Após o serviço de inventário atualizar o banco de dados, ele produz um evento para o tópico de inventário. Outro serviço pode consumir esse evento para verificar se o estoque de algum produto caiu abaixo do limiar mínimo, o que, por sua vez, aciona um serviço de reabastecimento para encomendar mais itens.
Processamento em Tempo Real com Stream API
Um caso de uso extremamente importante para o Kafka é a análise em tempo real. Dashboards de vendas são atualizados instantaneamente com cada transação, e aplicações como Uber dependem do envio constante de atualizações de localização dos motoristas para manter a interface do usuário sincronizada com a realidade.
Diferença entre Consumidores e Streams
O Kafka utiliza a Stream API para gerenciar esses fluxos contínuos. Consumidores regulares processam um evento por vez, como um serviço de notificação lendo um evento de pedido para enviar um e-mail. Em contraste, as Streams processam o fluxo contínuo de dados, permitindo agregações e junções para realizar processamento analítico em tempo real.
Escalabilidade: O Papel das Partições
Com milhões de usuários gerando dezenas de milhares de eventos por segundo, a escala de escritas e leituras se torna um desafio de performance. O conceito de partição é fundamental para a capacidade de escalabilidade do Kafka, tornando o processamento de grandes volumes de dados gerenciável sem comprometer a velocidade.
Partições como Divisões de Trabalho
As partições são análogas a adicionar mais trabalhadores a seções específicas de um escritório de correios. Em vez de uma fila única, o tópico é dividido. Por exemplo, no tópico de pedidos, podem ser criadas partições para pedidos da Europa, dos EUA e da Ásia. O engenheiro define essa estrutura de particionamento como parte do design do schema.
Otimizando o Consumo com Grupos
Embora as partições permitam que produtores escrevam em paralelo, é necessário escalar os consumidores para lidar com o volume de dados. Se um único serviço de inventário tentar processar todos os eventos, ele ficará sobrecarregado, mesmo com as partições distribuídas.
Agrupamento e Distribuição de Carga
Os grupos de consumidores resolvem esse problema. Ao iniciar instâncias adicionais do mesmo microsserviço (réplicas), elas se agrupam usando o atributo 'groupID' ao se registrarem no Kafka. O Kafka então distribui automaticamente as partições entre os consumidores ativos desse grupo, permitindo o processamento paralelo e aumentando a taxa de consumo.
- Réplicas com o mesmo 'groupID' formam um grupo de consumo.
- Kafka atribui partições específicas a cada consumidor ativo no grupo.
- Se um consumidor falhar, sua carga de partições é realocada para outro membro ativo.
A Infraestrutura Física: Kafka Broker
Os dados armazenados nos tópicos são fisicamente salvos nos servidores do Kafka, conhecidos como Brokers. Cada broker funciona como uma filial do correio, responsável por armazenar as mensagens no disco, gerenciar requisições de produtores e consumidores, e replicar os dados para garantir tolerância a falhas.
Diferença Crucial: Persistência vs. Exclusão
A principal distinção entre o Kafka e brokers de mensagem tradicionais reside na persistência. Brokers convencionais deletam mensagens assim que são consumidas. O Kafka, por outro lado, persiste cada evento conforme uma política de retenção configurável, permitindo que consumidores leiam os mesmos dados múltiplas vezes, o que é vital para análises de longo prazo.
Essa capacidade de processar fluxos de dados em tempo real mantendo os dados originais para análise posterior é o que realmente diferencia o Kafka.
Essa diferença é comparável à escolha entre assistir a um programa de TV pré-agendado (broker tradicional) e assistir sob demanda no Netflix (Kafka), onde o espectador controla o ritmo, a pausa e a possibilidade de rever o conteúdo.
Coordenação e o Fim da Dependência do Zookeeper
O Kafka requer um mecanismo para rastrear quais brokers estão ativos, eleger líderes e gerenciar a configuração do cluster. Tradicionalmente, essa coordenação era delegada a uma ferramenta externa chamada Zookeeper, que funcionava como um gerenciador central para todos os brokers.
A Introdução do KRaft
No entanto, versões mais recentes do Kafka, a partir da versão 3.0, introduziram o KRaft (Kafka Raft). Esta implementação integra a funcionalidade de coordenação diretamente no próprio Kafka, eliminando a necessidade de manter o Zookeeper como uma dependência externa e centralizando o controle dentro da infraestrutura Kafka.
Useful links
These links were generated based on the content of the video to help you deepen your knowledge about the topics discussed.