Apache Kafka
Todo negócio moderno gira em torno de dados. Precisamente por esta razão, diversas tecnologias, plataformas e frameworks surgiram ao longo dos anos para apoiar a gestão avançada de dados. Uma dessas soluções é o Apache Kafka, uma plataforma de streaming distribuída projetada para processamento de dados em alta velocidade e em tempo real.
Até o momento, o Kafka já foi amplamente adotado em milhares de empresas em todo o mundo. Nós o analisamos em profundidade para entender o que ele tem de especial e como diferentes empresas podem utilizá-lo.
O que é Apache Kafka?
Kafka é uma plataforma de streaming distribuída de código aberto que permite armazenar, ler e analisar dados em tempo real. É uma ferramenta poderosa, capaz de lidar com bilhões de eventos por dia e ainda funcionar rapidamente, principalmente graças à sua natureza distribuída.
Antes de se mudar para a comunidade e para a Fundação Apache em 2011, o Kafka foi originalmente criado no LinkedIn, para rastrear o comportamento de seus usuários e criar conexões entre eles. Na época, o objetivo era resolver um problema real com o qual os desenvolvedores do LinkedIn lutavam: ingestão de baixa latência de dados de grandes eventos. Havia uma clara necessidade de processamento em tempo real, mas não havia soluções que pudessem realmente acomodá-la.
Foi assim que Kafka nasceu. Desde então, ele percorreu um longo caminho e evoluiu para um sistema completo de mensagens distribuídas de publicação e assinatura, fornecendo a espinha dorsal para a construção de aplicativos robustos.
Como funciona o Kafka?
Basicamente, uma plataforma de streaming como o Kafka tem três recursos básicos: publicar e assinar fluxos de log, armazenar esses fluxos de log de maneira tolerante a falhas e processá-los à medida que ocorrem.
Especificamente com o Kafka, os aplicativos (neste caso, produtores) publicam mensagens (logs) que chegam a um nó Kafka (corretor). Cada registro (composto por uma chave, um valor e um carimbo de data/hora) é processado pelos chamados consumidores e armazenado em categorias chamadas tópicos que compõem os clusters Kafka.
No entanto, como os tópicos podem aumentar de tamanho, eles são divididos em partições menores para melhorar o desempenho e a escalabilidade. Todas as mensagens dentro de cada partição são ordenadas na sequência imutável em que chegaram e são continuamente adicionadas a um log de commit estruturado.
Além disso, aos registros nas partições é atribuído um número de identificação sequencial (deslocamento) que identifica exclusivamente cada registro na partição. Os dados das partições também são replicados em vários corretores para preservar todas as informações caso um deles morra.
O que também é interessante é que Kafka não se importa com quais registros estão sendo consumidos. O cluster Kafka persiste de forma duradoura todos os logs publicados usando um período de retenção configurável. São os próprios consumidores que pesquisam Kafka em busca de novas mensagens e dizem quais logs desejam ler. Porém, após o período definido, o registro é descartado para liberar espaço.
Quanto às APIs, existem cinco componentes principais no Kafka:
- A API Producer que permite ao aplicativo publicar um fluxo de registros para tópicos (um ou vários, por exemplo),
- A API do consumidor que permite ao aplicativo assinar tópicos e processar o fluxo de log correspondente,
- A API Flows que facilita a transformação eficaz de fluxos de entrada em fluxos de saída,
- A API do conector que permite criar e executar produtores ou consumidores reutilizáveis que conectam tópicos do Kafka a aplicativos ou sistemas de dados existentes,
- A API de administração que permite gerenciar e inspecionar tópicos, corretores e outros objetos Kafka.
A API Producer que permite ao aplicativo publicar um fluxo de registros para tópicos (um ou vários, por exemplo),
A API do consumidor que permite ao aplicativo assinar tópicos e processar o fluxo de log correspondente,
A API Flows que facilita a transformação eficaz de fluxos de entrada em fluxos de saída,
A API do conector que permite criar e executar produtores ou consumidores reutilizáveis que conectam tópicos do Kafka a aplicativos ou sistemas de dados existentes,
A API de administração que permite gerenciar e inspecionar tópicos, corretores e outros objetos Kafka.
Como resultado, Kafka é capaz de ingerir e mover rapidamente grandes quantidades de dados, facilitando a comunicação entre vários elementos de sistemas de computador, até mesmo vagamente conectados.
Vantagens e desvantagens do Apache Kafka?
Existem algumas razões pelas quais Kafka parece estar crescendo em popularidade. Primeiro, dada a enorme quantidade de dados produzidos e consumidos em diferentes serviços, aplicativos e dispositivos, muitas empresas podem se beneficiar hoje da arquitetura orientada a eventos. Diz-se que uma plataforma de streaming distribuída com armazenamento durável como o Kafka é a maneira mais limpa de alcançar tal arquitetura.
Kafka também se mostra confiável e rápido, especialmente graças à entrega de mensagens de baixa latência, E/S sequencial, princípio de cópia zero, bem como cluster e compactação eficiente de dados. Tudo isso faz do Kafka uma alternativa adequada aos corretores de mensagens tradicionais.
Porém, por outro lado, Kafka é simplesmente complicado. Para começar, você deve planejar e calcular um número adequado de corretores, tópicos e partições. Por outro lado, o reequilíbrio do cluster Kafka também pode impactar o desempenho tanto dos produtores como dos consumidores (e, portanto, interromper o processamento de dados). Falando em dados, é fácil excluir logs antigos muito cedo (em alto rendimento e baixo consumo de energia, por exemplo) para economizar espaço em disco. Pode facilmente ser um exagero se você realmente não precisar dos recursos do Kafka.
Para que serve o Apache Kafka?
De acordo com a equipe de desenvolvimento do Kafka, existem alguns casos de uso importantes para os quais ele foi projetado, incluindo:
- para mensagens
- rastreamento de atividade do site
- agregação de registros
- métricas operacionais
- processamento de fluxo
Sempre que houver necessidade de criar aplicativos de streaming em tempo real que precisem processar ou reagir a “pedaços” de dados ou transferir dados de maneira confiável entre sistemas ou aplicativos, o Kafka vem ao resgate.
É uma das razões pelas quais o Kafka funciona bem com aplicações bancárias e financeiras, onde as transações precisam ser processadas em uma ordem específica. O mesmo se aplica ao transporte e à logística, bem como ao retalho, especialmente quando estão envolvidos sensores IoT. Nestes setores, muitas vezes são necessários monitoramento constante, aplicações assíncronas e em tempo real (por exemplo, controles de inventário), análises avançadas e integração de sistemas, para citar alguns.
Na verdade, qualquer empresa que queira tirar partido da análise de dados e da integração de ferramentas complexas (por exemplo, entre aplicações de CRM, POS e e-commerce) pode beneficiar do Kafka. É precisamente onde ele se encaixa bem na equação.
Quem usa o Apache Kafka?
Não deveria ser surpresa que Kafka continue sendo uma parte essencial da infraestrutura do LinkedIn. Ele é usado principalmente para rastreamento de atividades, compartilhamento de mensagens e coleta de métricas, mas a lista de casos de uso não termina aqui. A maior parte da comunicação de dados entre os diferentes serviços no ambiente LinkedIn usa Kafka até certo ponto.
Neste momento, o LinkedIn admite manter mais de 100 clusters Kafka com mais de 4.000 corretores, servindo 100.000 tópicos e milhões de partições. O número total de mensagens tratadas pelas implantações Kafka do LinkedIn, por outro lado, já ultrapassou 7 bilhões por dia.
Embora nenhum outro serviço use Kafka na escala do LinkedIn, muitos outros aplicativos, empresas e projetos tiram vantagem dele. Na Uber, por exemplo, muitos processos são modelados com Kafka Streams – incluindo correspondência de cliente e motorista e cálculos de ETA. A Netflix também adotou a arquitetura Kafka multicluster para processamento de stream e agora lida perfeitamente com bilhões de mensagens todos os dias.
Na Future Mind, também tivemos a oportunidade de implementar o Kafka. Para o Fleet Connect, um sistema de rastreamento de veículos e gerenciamento de frotas, monitoramos a localização de cada veículo (juntamente com alguns outros parâmetros) graças a dispositivos dedicados dentro dele. Os dados coletados por esses dispositivos chegam ao IoT Gateway, que decodifica as mensagens e as envia ao Kafka. A partir daí, eles vão parar no IoT Collector, onde ocorre o processamento e a análise dos dados.
Curiosamente, os rastreadores dentro dos veículos enviam as mensagens uma a uma e por ordem de aparecimento, mas só depois de a anterior ter sido aceite e armazenada corretamente, para que não percamos nenhum dado relevante. Por isso, porém, temos que “assumir” todas essas mensagens rapidamente, para não sobrecarregar os rastreadores e processar os dados em tempo real.
Neste caso, o escalonamento horizontal com utilização de corretores clássicos, sistemas de mensagens e filas “tradicionais” não seria suficiente devido à especificidade do projeto e à necessidade de análise de dados em tempo real. Porém, com Kafka podemos dividir o fluxo de entrada em partições baseadas no ID do veículo e usar múltiplos corretores que garantem escalabilidade horizontal quase ilimitada, backup de dados em caso de falha, alta velocidade operacional, continuidade e processamento de dados em tempo real em um ordem específica.
Devo usar o Kafka para meus projetos?
1. Considere se você realmente precisa do Kafka se algumas das seguintes afirmações forem verdadeiras:
- Não há necessidade de processar milhares de mensagens por segundo
- Não há necessidade de manter a ordem específica em que os dados devem ser processados
- Uma possível perda de alguns logs em caso de failover não seria muito problemática
2. Pense nos diferentes componentes do sistema.
- De quantos corretores você precisa (ou seja, quão distribuído o sistema deve ser), quantas instâncias do ZooKeeper, quantos servidores e em quais locais?
- Quais temas e partições você planeja ter - eles podem ser alterados posteriormente, mas a mudança em si é bastante problemática
- Quantos produtores e consumidores diferentes utilizarão o sistema e em quantas instâncias (dentro de um grupo de consumidores) cada um deles será paralelizado?
3. Pense em toda a configuração, especialmente:
- Qual é a melhor escolha para uma chave de partição e qual é a estratégia de partição por trás dela?
- Como escolher a melhor estratégia de agrupamento de mensagens (tanto para produtores quanto para consumidores) para manter o equilíbrio entre velocidade de processamento/entrega e atrasos?
- Qual deve ser a política de novas tentativas e os tempos limite para mensagens entregues pelos produtores aos corretores Kafka?
4. Teste sua configuração e verifique se:
- Se um dos brokers fosse desabilitado, os demais brokers assumiriam o controle das partições gerenciadas por ele (em outras palavras, o rebalanceamento de partições seria ativado)?
- Se uma das instâncias do consumidor for desativada, as instâncias restantes dentro do mesmo grupo de consumidores começariam a processar mensagens das partições do consumidor inativas?
- Você consegue lidar com a política de novas tentativas e confirmar turnos e não perdeu nenhuma mensagem ou processou duplicatas ao longo do caminho?
5. Monitore Kafka usando as ferramentas disponíveis e verifique se:
- Não possui nenhuma partição que não seja usada
- Nenhum dos consumidores tem marca d’água muito alta
- Todos os corredores são saudáveis
- Todos os corretores e consumidores estão bem equilibrados