Apache Kafka
Lidando com grande volume de dados
Você provavelmente possui um perfil no LinkedIn e acessa o site com frequência. Provavelmente é um assinante do Netflix e interage com seus serviços pelo smartphone, web browser, vídeo game, ou TV. Talvez já utilizou o Uber ou se hospedou utilizando Airbnb. Se algum destes for o caso, parabéns, sabendo ou não, você é um usuário de um sistema chamado Apache Kafka. O Apache Kafka fornece a infraestrutura de message broker desses e muitos outros serviços massivos que utilizamos no nosso dia a dia. Cada um destes serviços produz centenas de bilhões de mensagens que somam centenas de terabytes de dados sendo movimentados e consumidos por dia. É realmente um grande volume de dados, ou melhor, Big data!
O objetivo deste post é entender o diferencial dessa ferramenta, o que faz ela ser utilizada por tantos serviços famosos e quais são os possíveis casos de uso.
O que é?
O Apache Kafka(chamado só Kafka neste post) é uma plataforma de streaming distribuído capaz de manipular trilhões de eventos por dia. Criado e disponibilizado Open source pelo LinkedIn em 2011, o Kafka foi inicialmente concebido como uma fila de mensagens, porém rapidamente evoluiu para um plataforma de streaming completa, possuindo não somente funcionalidades de message broker, mas também a capacidade de armazenar e processar os dados em um fluxo.
Como plataforma de streaming, as principais características que o Kafka possui são:
- Baixa latência. Capacidade de processar e entregar um alto fluxo de dados com pouco/mínimo atraso.
- Alto throughput. Capacidade de vazão de dados mesmo em hardwares mais modestos.
- Tolerância a falhas. Garantia do funcionamento do sistema mesmo em caso de falhas.
Conceitos
Para entender como o Kafka funciona, vamos entender alguns conceitos e keywords.
Kafka Cluster e Broker. O cluster é normalmente composto por múltiplos brokers para servir de load balancer. Uma instância de Kafka Broker pode lidar com centenas de milhares de leituras e gravações por segundo, e cada broker pode lidar com TeraBytes de mensagens sem impacto no desempenho.
Kafka Topic. Todas as mensagens do Kafka são organizadas em topics. Em outras palavras, topics são basicamente uma categoria para as mensagens. Os Kafka Topics são divididos em várias partitions. As partitions permitem que ele seja paralelizado, dividindo os dados de determinado topic em vários Brokers. Cada partition pode ser colocada em uma máquina separada, tornando possível a leitura de múltiplos Consumers em paralelo.
Kafka Consumer. Consumers leem os dados de qualquer partition, permitindo que o consumo seja redimensionado de acordo com a produção de mensagens. Os Consumers também podem ser organizados em Consumer Groups para um determinado topic. Utilizando Consumer Groups, cada Consumer do grupo lê a partir de uma partition única, sendo assim o grupo como um todo consome as mensagens de todo o topic.
Kafka Producer. Producers são conceitualmente mais simples que os Consumers, pois não existe a necessidade de coordenação de grupo(Consumer Groups). Sua principal função é mapear cada mensagem para uma partition do topic e enviar uma solicitação de produção para o líder da partition. O Producer não espera por confirmações do broker, sendo assim, ele envia dados o mais rápido o broker puder lidar.
Kafka API
O Kafka expõe todas as suas funcionalidades utilizando um protocolo independente de linguagem de programação e que possui client disponíveis e muitas linguagens de programação. Abaixo listo as quatro principais API disponibilizadas:
- Producer API. Permite que uma aplicação envie mensagens para um ou mais topics.
- Consumer API. Permite que uma aplicação receba e processe mensagens de um ou mais topics.
- Streams API. Permite que uma aplicação atue como uma processador de stream(fluxo), processando como entrada o stream de dados de um topic e produzindo como saída outro stream de dados para outro topic.
- Connector API. Permite construir e reutilizar um Producer ou Consumer que conectam topics com aplicações existentes. Por exemplo, um conector para um banco de dados relacional que captura cada mudança em determinada tabela.
Casos de uso de Kafka(exemplos)
Abaixo vou descrever alguns cenários que o Kafka serve para solucionar:
Exemplo 1 — Anúncio de imóveis
Imagine que você mantém um website de anúncio de imóveis. A todo momento, novos imóveis são anunciados. Alguns componentes do seu sistema necessitam ser informados quando tais anúncios são cadastrados — por exemplo, o componente de alerta de imóveis e analytics. Este cenário pode ser solucionado na seguinte maneira:
- Os dados dos anúncios são postados num Kafka Topic( utilizando a Producer API).
- Cada componente que precisa ser notificado — no nosso exemplo, o alerta de imóveis e o analytics — deverá utilizar a Consumer API e assinar o topic.
- Desta maneira, sempre que um anuncio for cadastrado, o Producer cadastrará no topic e cada componente receberá sua copia da mensagem,
Exemplo 2 — Atividade do website
Toda a atividade de um website ( visualizações de pagina, buscas ou qualquer outra ação que o usuário possa fazer) podem ser monitoradas e analisadas utilizando Kafka. Na verdade, essa foi a razão original para o qual o Kafka foi inventado pelo Linkedin. As atividades dos websites são publicadas em um Kafka Topic central e consequentemente dividindo topics por tipo de atividade. O resultado disso pode ser processado em tempo real para obter insights sobre o engajamento do usuário, desistências, fluxos de páginas e assim por diante.
Exemplo 3 — Uber-like app
Imagine que você possua dados de localização vindos de smartphones e você precisa processar estes dados em tempo real para mostrar o trajeto do veículo, a distância viajada, e assim por diante. Tendo em vista o volume de dados constantes, os dados recebidos podem ser publicados em Kafka Topics e processados com a API Stream.
Quando (talvez) não precise
Abaixo vou descrever alguns casos que o Kafka pode não ser a ferramenta certa:
A ordem de leitura é importante. Para processar as mensagens em uma ordem especifica, seria necessário possuir somente um Consumer e uma Partition. Mas esse não é o modo comum que o Kafka funciona, como vimos, normalmente haverão múltiplos Consumers e múltiplas Partitions. Devido a isto, se este for o caso, o Kafka pode não ser o aconselhado.
Pouco volume de dados. Se serão processadas apenas alguns milhares de mensagens por dia, então o Kafka é provavelmente um exagero. De fato, o Kafka é projetado para manipular e processados em larga escala, sendo assim, configurar/manter um cluster — que não é algo tão trivial assim — somente para isto pode não valer a pena.
Conclusão
Como alguns artigos estão falando:“Atualmente o mundo está sofrendo uma enchente de informações”. E o Kafka é uma das ferramentas para nos auxiliar a processar esse grande volume de dados. Mas como eu já falei em outros posts, não existe bala de prata, se o Kafka for utilizado fora do contexto para o qual ele foi proposto, o projeto pode ganhar complexidade sem existir a real necessidade. Para finalizar, gostaria de citar que o Kafka não é a única ferramenta para soluções de streaming e processamento de grande volume de dados. Existem concorrentes, se quiser ler um pouco mais sobre isso aconselho esta thread no Quora.
No próximo post pretendo continuar falando de Kafka e desenvolver exemplos utilizando as APIs.
Se quiser trocar uma ideia ou entrar em contato comigo, pode me achar no Twitter(@e_ferreirasouza) ou Linkedin.
Grande abraço e até a próxima!