Kafka — Consumindo vários tópicos

Willyan Guimarães
experienceCode
Published in
3 min readApr 27, 2020

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 :)

kkkkk

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

Mudanaças na classe ProducerLikeService.java

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!

--

--