Projeto Kafka com um cluster contendo três hosts kafka-2.2 e um host Avro Schema Registry.
Demonstrar como preparar um cluster Kafka com as configurações básicas para produção e consumo de dados em formato Avro Schema.
Este projeto foi criado tendo em mente que os desenvolvedores estão familiarizados com algum SO Linux, saibam configurará-lo em rede e, que ao menos tenham noções básicas sobre sistemas de messageria(Conceitos de tópicos e filas), Apache Avro Schemas, Java-7 e/ou Java-8.
Para os que estão começando agora, deixarei abaixo SUGESTÕES de estudos que devem ser realizados antes de iniciar este projeto para que possam ter uma boa base e não ficarem bloqueados caso algum imprevisto aconteça durante o processo.
- Comece por: "Java-8"
- Depois leia: "Kafka: The Definitive Guide", disponibilizado neste link
- "Making Sense of Stream Processing"
- Aprenda sobre o orquestrador/coordenador de aplicações distribuídas, Zookeeper
- Apache Avro Schema
- Comece por: "Learn Apache Kafka for Beginners".
- Para extrair e sincronizar dados de e para sistemas externos: "Kafka Connect"
- Kafka Streams for Data Processing
- Confluent Avro Schema Registry
- Kafka Cluster Setup and Administration
- Kafka Monitoring and Operations
- Kafka Ksql
- Kafka Security
- Os scripts de instalação e preparação de cada host do cluster Apache kafka.
- Os scripts de banco de dados das aplicações Spring Boot criadas para interagir com o cluster.
- O projeto Spring Boot Web "kafka-avro-client-retail-sales" que produz dados para os tópicos no cluster.
- Três projetos Spring Boot Web Rest que consomem os dados dos tópicos no cluster.
- SO: Ubuntu-18.04 Desktop LTS
- Software de criação de máquinas virtuais (VirtualBox ou VMware)
- Rede: net-tools
- Downloads: curl
- Java: openjdk-8-jdk
- Kafka: Apache kafka_2.12-2.2.0
- Avro Schema Registry: confluent-5.2.1-2.12
- BD Postgresql-10
Nota: Cada arquivo de setup listado abaixo deve ser executado em todos os hosts individualmente antes de passar para o próximo setup-x.sh
- Criar quatro hosts Linux com uma rede em modo bridge para que possam se comunicar
- Executar os comandos do arquivo: "scripts/install_cluster/conf_kafka_cluster/setup/setup-1.sh" para instalar e baixar os arquivos necessários. Apenas nos hosts que forem hospedar um kafka server!
- Executar os comandos do arquivo: "scripts/install_cluster/conf_kafka_cluster/setup/setup-2.sh" para instalar e configurar o orquestrador Zookeeper. Apenas nos hosts que forem hospedar um kafka server!
- Executar os comandos do arquivo: "scripts/install_cluster/conf_kafka_cluster/setup/setup-3.sh" para instalar e configurar o kafka. Apenas nos hosts que forem hospedar um kafka server!
- Executar os comandos do arquivo: "scripts/install_cluster/conf_kafka_cluster/setup/setup-4.sh" para instalar e configurar o Avro Schema Registry. Apenas nos hosts que forem hospedar o Avro Schema Registry!
- Executar os comandos do arquivo: "scripts/install_cluster/conf_kafka_cluster/zookeeper/topics.sh para criar os tópicos utilizados neste exemplo. Basta rodar em um dos hosts kafka que todos os demais hosts terão acesso a estes tópicos!
- Nos host onde for rodar os clientes java, você adicionar o IP dos hosts do cluster no arquivo de hosts. Exemplo: No Windows-10 o arquivo fica em "C:\Windows\System32\drivers\etc\hosts"
- Após instalar o banco de dados, editar o arquivo: "recources/application.properties" dos projetos: "kafka-avro-client-retail-sales, kafka-avro-client-rs-invoice-consumer, kafka-avro-client-rs-order-consumer e kafka-avro-client-rs-payment-consumer" adicionando suas configurações de acesso ao banco
- Criar o banco de dados: "retail_sales_order"
- Executar os scripts de banco em: "scripts/db_script/postgresql"
- Compilar o projeto: "kafka-avro-client-rs-commons" com o comando: "mvn clean package install -U -T 2"
- Compilar os demais projetos java com o comando: "mvn clean package -U"
- Com o cluster ativo e todos os hosts já configurados, executar o arquivo ".jar" de cada projeto em um prompt de comando separado a partir de um host/Notebook/PC que tenha acesso ao cluster
- Acessar o projeto WEB através da URL: "http:localhost:9000", se estiver rodando em ambiente local!
- Os consumidores não tem interface WEB. Então, basta acompanhar os logs no prompt
- O consumidor "Order" roda na porta: "10000", o consumidor: "Payment" roda na porta: "11000" e o consumidor "Invoice" roda na porta: "12000"
É um sistema que faz cadastro de pedidos, produz e consome dados em formato Avro em seus respectivos tópicos cobrindo os processos de solicitação de compra, pagamento e faturamento. Estes projetos não são completos. Foram criados apenas para fins de testes de fluxo em Java
- Ao adicionar um pedido, este é enviado para o tópico de pedidos
- O consumidor de pedidos irá pegar o pedido no tópico e persistir esses dados na base permitindo que o usuário possa fazer as devidas avaliações e aprovar essa solicitação de compra
- Uma vez que o pedido seja aprovado para pagamento, os dados do pagamento são enviados para o tópico de pagamentos
- O consumidor de pagamentos irá persistir esses dados na base permitindo que o usuário possa avaliar e aprovar o pagamento
- Uma vez aprovado o pagamento, os dados são enviados para o tópico de faturamentos e um consumidor irá persistir os dados para que o usuário possa avaliar e aprovar o faturamento
- Uma vez aprovado o faturamento, este é enviado para o tópico de separação de estoque para que o pedido possa ser destinado ao cliente.
A idéia aqui foi simular um sistema hipotético de vendas no varejo. Como o intuito é apenas demonstar como produzir e consumir dados em formato Avro, o sistema não está completo e tem alguns dados mocados. Mas, o que eu quero com isto é demonstar o poder que temos em mãos utilizando essa poderosa ferramenta de messageria e streaming de dados. Neste caso específico, se bem planejado e aplicado em um cenário real, os dados coletados deste sistema ou do conjunto de sistemas que atendem a empresa, poderiam ser processados em tempo real e poderiam ser inseridos em um data warehouse que poderia gerar relatórios e métricas que podem ajudar a diretoria da empresa a decidir que produtos vender ou comprar em determinadas épocas do ano e/ou em cada região do país. E isso é só uma das formas de se tirar proveito desta plataforma!
Estou a sete anos na área e sempre em busca de uma integração melhor e mais robusta! Linkedin: André Barroso