Kafka Connect e Kafka Streams Integre suas aplicações ao Kafka usando as melhores práticas
Rodrigo Vieira PintoSobre o livro
Kafka é uma tecnologia que vem sendo cada vez mais adotada no mercado. Com ele, podemos criar sistemas altamente distribuídos e desacoplados, podendo transferir grandes volumes de dados com baixa latência.
Entretanto, para que as aplicações se beneficiem de suas características, é necessário que elas sejam consumidoras ou produtoras de mensagens, o que nem sempre é possível (dada a tecnologia em que a aplicação foi construída), ou mesmo desejável (produtores/consumidores podem ter sido construídos em diversas linguagens de programação, com suas respectivas bibliotecas de integração, e ainda podem precisar lidar com questões relacionadas a garantias de envio e consumo de mensagens, por exemplo).
Nesses cenários, o uso de ferramentas que atuem como intermediárias entre as aplicações e os tópicos Kafka torna-se importante, pois podemos encapsular a resolução desses problemas. E o Kafka Connect é uma delas.
Podemos encontrar bons exemplos de uso do Kafka Connect em aplicações mais antigas, onde as tecnologias usadas não suportam a construção de produtores de mensagens Kafka. E, graças a conectores previamente instalados no Kafka Connect, podemos conectar diversas fontes de dados dessas aplicações a tópicos Kafka, sem que sejam necessárias grandes alterações nas aplicações.
Felizmente, seu uso não se restringe somente a sistemas legados. A extração de partes de código de um monolito para a construção de microsserviços também pode se beneficiar dessa tecnologia. O monolito pode, por exemplo, compartilhar dados de suas fontes de dados com os microsserviços extraídos de forma transparente.
O Kafka Connect pode ser considerado, portanto, uma central de dados, onde diversas fontes (sejam elas bases relacionais, arquivos, filas ou sistemas como SAP, Service Now, Salesforce) podem disponibilizar a ele suas informações de forma simples e sem a necessidade de escrita de código.
Ao lado do Kafka Connect, temos também a tecnologia Kafka Streams. Com ela, é possível tratar o recebimento de mensagens como eventos, de um ou mais tópicos, realizando desde operações semelhantes a que realizamos com tabelas em bancos de dados, como junções (joins), uniões (unions) ou até mesmo operações encontradas nas collections do Java como filter ou map.
Para o estudo dessas ferramentas, usaremos um estudo de caso fictício envolvendo a compra de passagens aéreas e hospedagens, o Alura Viagens e Turismo. Ele será composto de diversos microsserviços, que serão apresentados ao longo dos capítulos. Veremos diversas maneiras de conectá-los ao Kafka usando o Kafka Connect e bancos relacionais e não relacionais como fontes de dados. Estudaremos alguns conceitos relacionados a resiliência de aplicações, e veremos como o Kafka Connect nos ajuda com isso. Implementaremos manipulações nos dados diretamente no Kafka Connect usando Single Message Transformations (SMTs) e transformações de dados usando dados de diversos tópicos usando o Kafka Streams. Também escreveremos testes automatizados que mostrem que o código que criamos está funcionando corretamente. Por último, no apêndice, implementaremos padrões como Transactional Outbox nos microsserviços, e utilizaremos o Kafka Connect como parte da implementação.
Para quem é este livro
Este livro é indicado para desenvolvedores que já possuam experiência com a ferramenta Kafka, e que gostariam de implementar soluções resilientes, desacopladas, simples e confiáveis no processamento de mensagens assíncronas usando ferramentas como Kafka Connect e Kafka Streams. Profissionais que já tiveram que lidar com problemas de consumo ou envio de mensagens para o Kafka nas suas aplicações, independente da linguagem de programação ou biblioteca utilizadas, certamente encontrarão nessas ferramentas recursos que facilitarão bastante o seu trabalho.
Usaremos diversos bancos de dados nos exemplos, desde os relacionais como o Postgres e o MySQL até não relacionais como o MongoDB. Logo, conhecimentos relacionados a bancos de dados são importantes.
Usaremos o docker para rodá-los, nos exemplos do livro, bem como a linguagem Java nos diversos microsserviços que implementaremos ao longo dos capítulos.
Prefácio
Recebi com enorme felicidade o convite do Rodrigo para escrever o prefácio deste livro. É ótimo saber que teremos mais um livro sobre Kafka disponível em português. Recordo-me de que, quando comecei a trabalhar com Kafka, em 2016, não havia tanto material disponível. Na época, tive que aprender, com muita pesquisa, pouco material e muitos erros a lidar com essa ferramenta tão extraordinária.
No meu primeiro contato com Kafka, foi-me pedido para fazer uma Prova de Conceito (Proof of Concept – PoC) em uma "base não relacional chamada Kafka". Não sei de onde a pessoa tirou que Kafka era uma base de dados, talvez tivesse lido em algum blog lá em 2016 ou talvez tivesse assistido a uma palestra em alguma conferência... Não vou fazer pesquisa arqueológica na internet para saber onde informação surgiu, mas embora em 2018 Martin Kleppmann tenha apresentado um keynote no Kafka Summit com o título Is Kafka a Database? ("Kafka é uma base de dados?" em tradução livre), Kafka não pode ser usado como uma base de dados tradicional.
Pensando que era uma base de dados, minha primeira atividade foi criar um "Hello World" que enviasse uma mensagem para o broker Kafka e outro que lesse a mensagem. Ao ter sucesso, decidi que minha segunda atividade seria alterar essa mensagem após enviada. Pensando ser possível, passei dias tentando, li os escassos posts de blog até chegar à conclusão de que, uma vez enviada uma mensagem, ela não pode ser apagada. Nós nos acostumamos com dados mutáveis, dados que podem ser acessados e alterados, mas a maioria das aplicações Kafka, usa-se de eventos para fazer a comunicação entre os serviços. Eventos são um tipo de dado que representam "algo que aconteceu no tempo". Você não pode alterar um evento, só pode enviar um novo evento dizendo que algo novo aconteceu.
Contei essa anedota sobre meus primeiros dias com Apache Kafka para demonstrar que é preciso alinhar as nossas expectativas quando vamos aprender uma ferramenta nova. Kafka, por mais que possa atuar como uma base de dados, não é uma base de dados. Kafka, a princípio, era apenas um Message-Oriented Middleware, ou seja, é uma camada de software que integra sistemas heterogêneos através da troca de mensagens. Até 2015, existia o apenas o broker e as bibliotecas para podermos enviar e ler mensagens. Assim, as aplicações liam e escreviam mensagens de forma distribuída e independentes.
O Kafka Connect surge em 2015 (ver em https://archive.apache.org/dist/kafka/0.9.0.0/RELEASENOTES.html o Release Notes da versão 0.9.0.0) com a missão de integrar facilmente outros sistemas ao broker Kafka. Antes do Kafka Connect, se fosse para integrar uma aplicação a um broker Kafka, cada serviço deveria ser reescrito para fazer não só escrever na sua própria base de dados, mas também para enviar eventos ao broker Kafka. Você deve estar pensando: "Difícil, né!" Com toda a razão, é muito difícil integrar aplicações existentes usando apenas producers e consumers Kafka.
O Kafka Connect facilita a vida de quem precisa integrar uma aplicação existente com o Kafka. Agora não é mais preciso fazer uma escrita dupla para garantir a integridade dos dados, basta criar um Source Connector conforme descrito no livro e fazer com que serviços rodem independentemente. Depois de integrar sua aplicação, você pode evoluir sua arquitetura para Event-Driven, onde os serviços notificam uns aos outros por meio de eventos. Também será possível criar aplicações Stream Processing, usando o Kafka Stream, para fazer o processamento de eventos continuamente. Por fim, você pode propor na sua empresa que tratem eventos como um produto, da mesma forma que APIs são tratadas como produtos, provendo infraestrutura para documentar os tópicos e schemas usados.
Com sua habilidade exemplar como professor, Rodrigo conduz uma jornada dinâmica, ilustrando o uso prático do Kafka Connect na evolução de projetos, com o cenário concreto da Alura Viagens e Turismo. Este livro não apenas ensina os conceitos fundamentais do Kafka Connect, mas também capacita você a integrar seus sistemas de forma eficaz por meio dos brokers Kafka. Prepare-se para dominar essa ferramenta essencial com a orientação especializada de Rodrigo.
Divirta-se.
Victor Emanuel Perticarrari Osório
Sumário
- O Alura Viagens e Turismo
- 1 Funcionalidades da solução
- 2 Onboarding – ferramentas a serem instaladas
- 3 Kafka Connect: Conceitos básicos
- 3.1 O Kafka Connect
- 3.2 Criando nossa imagem de Kafka Connect
- 3.3 Integração entre o ms-companhias-aereas e o ms-pesquisa
- 3.4 O conector para a base de dados do ms-companhias-aereas
- 3.5 Subindo a infraestrutura da aplicação
- 3.6 A Kafka Connect REST API
- 3.7 Testando a solução
- 3.8 Resumo
- Kafka Connect e seus recursos
- 4 Kafka Connect e a resiliência das aplicações
- 4.1 Leitura do banco de dados pelo Kafka Connect
- 4.2 Um cenário mais específico - cancelamento de novos voos com os Tombstones Events
- 4.3 Resumo
- 5 Melhorias nas mensagens postadas e o ms-pesquisa
- 5.1 Remoção de JSON Schema do conteúdo das mensagens
- 5.2 Single Message Transformations (SMT)
- 5.3 Recepção de voos via @KafkaListener, @KafkaHandler e o KafkaNull
- 5.4 Resumo
- 6 Busca e seleção de voos no ms-pesquisa
- 6.1 Busca de voos
- 6.2 Seleção de voo
- 6.3 Integração entre o ms-pesquisa e o ms-selecao-hospedagens via Kafka Connect
- 6.4 Publicação de mudanças no schema do banco de dados por padrão
- 6.5 Formato das mensagens e o JsonConverter
- 6.6 Formato das chaves no tópico, e a concatenação de SMTs
- 6.7 Leitura de dados do MySQL pelos conectores CDC
- 6.8 Resumo
- 7 Busca e seleção de hospedagens no ms-selecao-hospedagens
- 7.1 Busca de hospedagens
- 7.2 Envio de registros do ms-selecao-hospedagens para tópicos do Kafka via Kafka Connect
- 7.3 Leitura de dados do Postgres pelos conectores CDC
- 7.4 Resumo
- 8 Boas práticas para nomes de tópicos e outros SMTs interessantes
- 8.1 Nomeação de tópicos
- 8.2 Recomendações para nomes de tópicos
- 8.3 Renomeação de tópicos no Alura Viagens com o RegexRouter
- 8.4 Uma SMT necessária: filtros
- 8.5 SMTs encadeadas e sua ordenação
- 8.6 Resumo
- Kafka Streams e algumas topologias avançadas
- 9 Montagem de pacotes de viagem com o ms-pacote e o Kafka Streams
- 9.1 O ms-pacote
- 9.2 Kafka Streams
- 9.3 Montagem do fluxo de criação de pacotes de viagem com o KStream
- 9.4 Problemas com as chaves usadas
- 9.5 Encadeamento de SMTs ao resgate e o SMT ValueToKey
- 9.6 Resumo
- 10 Informações sobre pacotes vendidos com KTable e o ms-marketing
- 10.1 Um novo tópico para hospedagens
- 10.2 Criação da topologia e o KTable
- 10.3 Kafka Streams lento?
- 10.4 Resumo
- Testes automatizados
- 11 Testes automatizados de consumo de mensagens
- 11.1 Testes unitários do ReceptorDeVoos no ms-pesquisa
- 11.2 Testes integrados de consumo de mensagens do Kafka no ms-pesquisa - @EmbeddedKafka
- 11.3 Testes integrados de consumo de mensagens do Kafka no ms-pesquisa, usando diretamente o Kafka
- 11.4 Resumo
- 12 Testes de topologias no Kafka Streams e o RocksDB
- 12.1 O RocksDB
- 12.2 Os objetos StreamsBuilderFactoryBean e KafkaStreams
- 12.3 Teste de topologia no ms-pacote
- 12.4 Testes assíncronos e a biblioteca Awaitility
- 12.5 Testes de topologia no ms-marketing
- 12.6 Resumo
- Encerramento
- 13 Apêndice - Transactional Outbox Pattern (e padrões relacionados)
- 13.1 Outra collection para o ms-companhias-aereas, e transações com MongoDB
- 13.2 Transações de banco de dados e garantias de envio de mensagens
- 13.3 O Transactional Outbox Pattern e os padrões Polling Publisher e Transaction Log Tailing
- 13.4 Resumo
- 14 Bibliografia
Dados do produto
- Número de páginas:
- 284
- ISBN:
- 978-85-5519-377-4
- Data publicação:
- 05/2024