Qual é a diferença entre o Kafka e o RabbitMQ?

O Kafka e o RabbitMQ são sistemas de fila de mensagens que você pode usar no processamento de fluxos. Um fluxo de dados são dados incrementais, contínuos e de alto volume que requerem processamento em alta velocidade. Por exemplo, podem ser dados de sensores sobre o ambiente que você deve coletar e processar continuamente para observar mudanças em tempo real na temperatura ou na pressão do ar. O RabbitMQ é um agente de mensagens distribuído que coleta dados de streaming de várias fontes para roteá-los para diferentes destinos para processamento. O Apache Kafka é uma plataforma de streaming para desenvolvimento de pipelines de dados e aplicações de streaming em tempo real. O Kafka fornece um sistema de mensagens altamente escalável, tolerante a falhas e durável, com mais recursos do que o RabbitMQ.

Leia sobre dados de streaming »

Leia sobre o Apache Kafka »

Diferenças arquitetônicas: Kafka vs. RabbitMQ

O RabbitMQ e o Apache Kafka permitem que os produtores enviem mensagens aos consumidores. Produtores são aplicativos que publicam informações, enquanto consumidores são aplicativos que assinam e processam informações.

Produtores e consumidores interagem de forma diferente no RabbitMQ e no Kafka. No RabbitMQ, o produtor envia e monitora se a mensagem chega ao consumidor pretendido. Por outro lado, os produtores de Kafka publicam mensagens na fila, independentemente de os consumidores as terem recuperado.

Pense no RabbitMQ como uma agência postal que recebe correspondência e a entrega aos destinatários pretendidos. Enquanto isso, o Kafka é semelhante a uma biblioteca, que organiza mensagens em prateleiras com diferentes gêneros que os produtores publicam. Em seguida, os consumidores leem as mensagens das respectivas prateleiras e lembram o que leram. 

Abordagem arquitetônica do RabbitMQ

Um agente do RabbitMQ permite baixa latência e distribuições complexas de mensagens com os seguintes componentes:

  • Uma troca recebe mensagens do produtor e determina para onde elas devem ser encaminhadas
  • Uma fila é um armazenamento que recebe mensagens de uma central de troca e as envia aos consumidores
  • Uma vinculação é um caminho que conecta uma central de troca e um agente

No RabbitMQ, uma chave de roteamento é um atributo de mensagem usado para rotear mensagens de uma central de troca para uma fila específica. Quando um produtor envia uma mensagem para uma central de troca, ela inclui uma chave de roteamento como parte da mensagem. A central de troca então usa essa chave de roteamento para determinar para qual fila a mensagem deve ser entregue.

Abordagem arquitetônica do Kafka

Um cluster do Kafka fornece processamento de eventos de fluxo de alto throughput com uma arquitetura mais complexa. Estes são alguns dos principais componentes do Kafka:

  • Um agente do Kafka é um servidor do Kafka que permite que os produtores transmitam dados aos consumidores. O agente do Kafka contém tópicos e suas respectivas partições. 
  • Um tópico é o armazenamento de dados que agrupa dados semelhantes em um agente do Kafka. 
  • Uma partição é um armazenamento de dados menor em um tópico que os consumidores assinam. 
  • O ZooKeeper é um software especial que gerencia os clusters e partições do Kafka para fornecer streaming tolerante a falhas. O ZooKeeper foi recentemente substituído pelo protocolo Apache Kafka Raft (KRaft).

Os produtores no Kafka atribuem uma chave a cada mensagem. Em seguida, o agente do Kafka armazena a mensagem na partição principal desse tópico específico. O protocolo KRaft usa algoritmos de consenso para determinar a partição principal. 

Como o Kafka e o RabbitMQ lidam com as mensagens de forma diferente?

O RabbitMQ e o Apache Kafka transferem dados dos produtores para os consumidores de maneiras diferentes. O RabbitMQ é um agente de mensagens de uso geral que prioriza a entrega de mensagens de ponta a ponta. O Kafka é uma plataforma distribuída de transmissão de eventos que faz a troca em tempo real de big data contínuo.

O RabbitMQ e o Kafka foram projetados para diferentes casos de uso, e é por isso que eles lidam com as mensagens de forma diferente. A seguir, discutiremos algumas diferenças específicas.

Consumo de mensagens

No RabbitMQ, o agente garante que os consumidores recebam a mensagem. O aplicativo para consumidores assume um papel passivo e espera que o agente do RabbitMQ coloque a mensagem na fila. Por exemplo, um aplicativo bancário pode esperar por alertas de SMS do software central de processamento de transações.

Os consumidores do Kafka, no entanto, são mais proativos na leitura e rastreamento de informações. À medida que as mensagens são adicionadas aos arquivos de log físicos, os consumidores do Kafka acompanham a última mensagem que leram e atualizam adequadamente o rastreador de posição. Um rastreador de posição é um contador que aumenta após a leitura de uma mensagem. Com Kafka, o produtor não está ciente da recuperação de mensagens pelos consumidores. 

Prioridade da mensagem

Os agentes do RabbitMQ permitem que o software do produtor privilegiem determinadas mensagens usando a fila prioritária. Em vez de enviar mensagens na ordem primeiro a entrar, primeiro a sair, o agente processa mensagens de maior prioridade antes das mensagens normais. Por exemplo, um aplicativo de varejo pode enfileirar transações de vendas a cada hora. No entanto, se o administrador do sistema emitir uma mensagem de backup prioritário do banco de dados, o agente a enviará imediatamente.

Ao contrário do RabbitMQ, o Apache Kafka não oferece filas prioritárias. A ferramenta trata todas as mensagens da mesma forma ao distribuí-las em suas respectivas partições. 

Ordenação de mensagens

O RabbitMQ envia e enfileira mensagens em uma ordem específica. A menos que uma mensagem de maior prioridade seja colocada em fila no sistema, os consumidores recebem mensagens na ordem em que foram enviadas.

Enquanto isso, o Kafka usa tópicos e partições para enfileirar mensagens. Quando um produtor envia uma mensagem, ela entra em um tópico e uma partição específicos. Como o Kafka não permite trocas diretas entre produtores e consumidores, o consumidor extrai mensagens da partição em uma ordem diferente. 

Exclusão de mensagens

Um agente do RabbitMQ encaminha a mensagem para a fila de destino. Depois de lido, o consumidor envia uma resposta de confirmação (ACK) ao agente, que então exclui a mensagem da fila.

Ao contrário do RabbitMQ, o Apache Kafka anexa a mensagem a um arquivo de log, que permanece até que seu período de retenção expire. Dessa forma, os consumidores podem reprocessar os dados transmitidos a qualquer momento dentro do período estipulado.

Outras diferenças importantes: Kafka vs. RabbitMQ

O RabbitMQ fornece roteamento de mensagens complexo com arquitetura simples, enquanto o Kafka oferece um sistema de agente de mensagens durável que permite que os aplicativos processem dados no histórico do stream.

Em seguida, compartilhamos mais diferenças entre os dois agentes de mensagens. 

Performance

Tanto o RabbitMQ quanto o Kafka oferecem transmissão de mensagens de alto desempenho para os casos de uso pretendidos. No entanto, o Kafka supera o RabbitMQ na capacidade de transmissão de mensagens.

O Kafka pode enviar milhões de mensagens por segundo, pois usa E/S de disco sequencial para permitir uma troca de alto throughput. A E/S de disco sequencial é um sistema de armazenamento que armazena e acessa dados do espaço de memória adjacente e é mais rápido do que o acesso aleatório ao disco.

O RabbitMQ também pode enviar milhões de mensagens por segundo, mas requer vários agentes para fazer isso. Normalmente, o desempenho do RabbitMQ é em média de milhares de mensagens por segundo e pode diminuir se as filas da ferramenta estiverem congestionadas. 

Segurança

O RabbitMQ e o Kafka permitem que os aplicativos troquem mensagens com segurança, mas com tecnologias diferentes.

O RabbitMQ vem com ferramentas administrativas para gerenciar as permissões do usuário e a segurança do agente.

Enquanto isso, a arquitetura Apache Kafka fornece fluxos de eventos seguros com TLS e Java Authentication and Authorization Service (JAAS). O TLS é uma tecnologia de criptografia que impede a espionagem não intencional de mensagens, e o JAAS controla qual aplicativo tem acesso ao sistema do agente. 

Linguagem de programação e protocolos

Tanto o Kafka quanto o RabbitMQ aceitam várias linguagens, estruturas e protocolos que os desenvolvedores já conhecem.

Você pode codificar em Java e Ruby ao criar aplicativos cliente para Kafka e RabbitMQ. Além disso, o Kafka é compatível com Python e Node.js, enquanto o RabbitMQ é compatível com JavaScript, Go, C, Swift, Spring, Elixir, PHP e .NET.

O Kafka usa o protocolo binário via TCP para transmitir mensagens em canais de dados em tempo real, enquanto o RabbitMQ é compatível com o Advanced Message Queuing Protocol (AMQP) por padrão. O RabbitMQ também aceita protocolos antigos, como o Simple Text Orientated Messaging Protocol (STOMP) e o MQTT para rotear mensagens.

Leia sobre MQTT »

Quais são as semelhanças entre Kafka e RabbitMQ?

Os aplicativos precisam de agentes de mensagens confiáveis para trocar dados na nuvem. Tanto o RabbitMQ quanto o Kafka fornecem plataformas dimensionáveis e tolerantes a falhas para atender às crescentes demandas de tráfego e à alta disponibilidade.

A seguir, discutimos algumas semelhanças importantes entre o RabbitMQ e o Kafka.

Escalabilidade

O RabbitMQ pode expandir sua capacidade de processamento de mensagens tanto horizontal quanto verticalmente. Você pode alocar mais recursos computacionais para o servidor do RabbitMQ a fim de aumentar a eficiência da troca de mensagens. Em alguns casos, desenvolvedores usam uma técnica de distribuição de mensagens chamada de troca de hash consistente do RabbitMQ para equilibrar o processamento de carga em vários agentes.

Da mesma forma, a arquitetura Kafka permite adicionar mais partições a um tópico específico para distribuir o carregamento da mensagem uniformemente. 

Tolerância a falhas

Tanto o Kafka quanto o RabbitMQ são arquiteturas robustas de enfileiramento de mensagens, resilientes a falhas do sistema.

Você pode agrupar vários agentes do RabbitMQ em clusters e implantá-los em servidores diferentes. O RabbitMQ também replica mensagens em fila em nós distribuídos. Isso permite que o sistema se recupere de uma falha que afeta algum servidor.

Como o RabbitMQ, o Apache Kafka compartilha capacidade de recuperação e redundância semelhantes ao hospedar clusters do Kafka em servidores diferentes. Cada cluster consiste em réplicas de arquivos de log que você pode recuperar em caso de falha.

Facilidade de uso

Ambos os sistemas de fila de mensagens têm forte suporte da comunidade e bibliotecas que simplificam o envio, a leitura e o processamento de mensagens. Isso facilita o desenvolvimento de aplicativos cliente para desenvolvedores em ambos os sistemas.

Por exemplo, você pode usar o Kafka Streams (uma biblioteca cliente) a fim de criar sistemas de mensagens no Kafka e no Spring Cloud Data Flow para criar microsserviços orientados por eventos com o RabbitMQ.

Quando usar Kafka vs. RabbitMQ

É importante entender que o RabbitMQ e o Kafka não são agentes de mensagens concorrentes. Ambos foram projetados para ajudar na troca de dados em diferentes casos de uso, onde um é mais adequado do que o outro.

A seguir, discutimos alguns casos de uso a serem considerados para RabbitMQ e Kafka.

Retransmissões de eventos

O Kafka é adequado para aplicativos que precisam reanalisar os dados recebidos. É possível processar dados de streaming várias vezes durante o período de retenção ou coletar arquivos de log para análise.

A agregação de logs com o RabbitMQ é mais desafiadora, pois as mensagens são excluídas depois de consumidas. Uma solução alternativa é reproduzir novamente as mensagens armazenadas dos produtores.

Processamento de dados em tempo real

O Kafka transmite mensagens com latência muito baixa e é adequado para analisar dados de streaming em tempo real. Por exemplo, é possível usar o Kafka como um serviço distribuído de monitoramento para gerar alertas de processamento de transações on-line em tempo real.

Arquitetura de roteamento complexa

O RabbitMQ fornece flexibilidade para clientes com requisitos vagos ou cenários de roteamento complexos. Por exemplo, é possível configurar o RabbitMQ para rotear dados a diferentes aplicativos com vinculações e trocas distintas.

Entrega eficaz de mensagens

O RabbitMQ aplica o modelo push, ou seja, o produtor sabe se o aplicativo cliente consumiu a mensagem. Ele é adequado para aplicativos que devem seguir sequências específicas e garantias de entrega ao trocar e analisar dados. 

Compatibilidade com idiomas e protocolos

Desenvolvedores usam o RabbitMQ para aplicativos de clientes que exigem compatibilidade com versões anteriores de protocolos antigos, como MQTT e STOMP. O RabbitMQ também aceita uma variedade mais ampla de linguagens de programação em comparação com o Kafka.

O Kafka usa o RabbitMQ?

O Kafka não usa o RabbitMQ. É um agente de mensagens independente que distribui fluxos de eventos em tempo real sem usar o RabbitMQ. Ambos são sistemas de troca de dados separados que funcionam independentemente um do outro.

No entanto, alguns desenvolvedores encaminham mensagens da rede do RabbitMQ para o Kafka. Essas pessoas fazem isso porque é preciso mais esforço para desconstruir os pipelines de dados existentes do RabbitMQ e reconstruí-los com o Kafka. 

Resumo das diferenças: Kafka vs. RabbitMQ

 

RabbitMQ

Kafka

Arquitetura

A arquitetura do RabbitMQ foi projetada para roteamento de mensagens complexo. Ela usa o modelo push. Produtores enviam mensagens aos consumidores com regras diferentes. 

Já o Kafka usa design baseado em partições para processamento de transmissões em tempo real e de alto throughput. Ele usa o modelo pull. Os produtores publicam mensagens em tópicos e partições que os consumidores assinam. 

Tratamento de mensagens

Os agentes do RabbitMQ monitoram o consumo de mensagens. As mensagens são excluídas após o consumo. A ferramenta permite atribuir níveis de prioridade às mensagens. 

Os consumidores acompanham a recuperação de mensagens com um rastreador de posição. O Kafka retém as mensagens de acordo com a política de retenção. Não há prioridade de mensagem. 

Performance

O RabbitMQ tem baixa latência. A ferramenta envia milhares de mensagens por segundo.

O Kafka transmite em tempo real até milhões de mensagens por segundo.

Linguagem de programação e protocolo

O RabbitMQ oferece uma ampla variedade de linguagens e protocolos herdados.

O Kafka tem opções limitadas de linguagens de programação. A ferramenta usa protocolo binário sobre TCP para transmissão de dados. 

Como a AWS atende aos seus requisitos para RabbitMQ e Kafka?

A Amazon Web Services (AWS) fornece serviços de agente de mensagens de baixa latência e totalmente gerenciados para implementações do RabbitMQ e do Kafka:

  • Use o Amazon MQ a fim de provisionar seus agentes do RabbitMQ sem configurações que levam muito tempo para ser definidas. O Amazon MQ criptografa mensagens do RabbitMQ em trânsito e em repouso. Também garantimos pipelines de dados de alta disponibilidade em todas as zonas de disponibilidade da AWS. 

Crie uma conta agora mesmo para começar a usar agentes de mensagens na AWS.

Próximas etapas com a AWS