Kafka — Consumindo vários tópicos
Nos posts anteriores trabalhamos as ideias de produzir e consumir mensagens de um tópico Kafka utilizando Kafka Clients. Caso ainda não tenha visto não deixe de conferir para entender a linha de raciocínio desta postagem.
Neste momento vamos fazer algumas melhorias no projeto e configurar mais consumidores e também um caso especial onde um único consumidor pode ler vários tópicos.
Algumas melhorias
Vamos mudar o padrão de nomes, de forma a começar a pensar numa estrutura de projeto. A classe que consome o tópico de likes por post poderíamos considerar como um serviço, assim como a que produz, então:
NewLikeConsumerMain.java => ConsumerLikeService.javaLikeProducerMain => ProducerLikeService.java
Também faz sentido repensar um pouco o nome dos tópicos, de forma a estruturar o seguinte padrão:
APLICACAO_ASSUNTO_NOME_ASSUNTO
Então, faríamos assim:
LIKES_POST => SOCIAL_NETWORKING_SUBJECT_LIKES_POST
Pronto, por hora esses são os improvements :)
Um cenário das redes sociais
Várias redes sociais possuem a funcionalidade de exibir a atividade de um amigo que você siga, mais ou menos assim:
joão curtiu a publicação de johnjohn começou a seguir joão
Certo, poderíamos interpretar que essas ações geram mensagens em dois tópicos:
- Um tópico para que os usuários recebam as notificações, que foi o tópico que já criamos nesse post e melhoramos o nome acima;
- Um tópico para registrar essas ações numa timeline a ser visualizada por outros usuários
Nessa linha, teríamos agora dois tópicos:
Likes em um post para o usuário visualizar:
SOCIAL_NETWORKING_SUBJECT_LIKES_POST
Ações de usuários para serem visualizadas na timeline de atividades:
SOCIAL_NETWORKING_ACTIONS_USERS
Compreendeu ?
Colocando a mão na massa
Com base no projeto anterior, faríamos as seguintes alterações:
Produzir mensagem para mais de um tópico
Como foi explicado, passamos a gerar mensagens para os dois tópicos, que são para visualizar o like no post e as ações do usuário. Logo, temos que dois ProducerRecords foram criados com os dados.
Consumir a mensagem do novo tópico
Um novo tópico, um novo consumir. Seguimos a mesma lógica de código. Se inscreve no tópico que deseja escutar e segue em frente.
Nada de outro mundo né? Bem simples. Seguimos o mesmo padrão.
Consumindo vários tópicos em um único consumidor
É comum que alguns sistemas tenham uma forma de registrar todos os eventos que acontecem, o que poderíamos chamar de log.
Vamos supor que nesse caso todas as mensagens que chegam ao broker passam por um consumidor de registro dos eventos, ou seja, um LogService:
Veja que temos uma expressão regular que é a mudança a se observar neste consumidor, possibilitando que todos os tópicos que sigam o pattern de nome SOCIAL_NETWORKING.* sejam consumidos.
Testando
- Execute o Kafka. Se ainda não sabe os comandos, olhe aqui.
- Execute as classes “ConsumerActionLikeService”, “ConsumerLikeService” e “LogService” para ficarem aguardando por mensagens para serem consumidas.
- Executa a classe “ProducerLikeService” para produzir mensagens nos tópicos.
- Veja a saída de console de cada uma das classes, verificando no output que LogService consumirá de todos os tópicos e os demais Services consumirão unicamente os tópicos em que estão inscritos.
Este código está disponível no GitHub
Enfim na próxima postagem veremos como paralelizar tarefas \o/
Críticas e sugestões são sempre bem-vindas!