quarta-feira, setembro 18, 2024
spot_img
InícioRamos da InformáticaDevOps e DevSecOpsConsumo de filas com o RabbitMQ e o Node.js

Consumo de filas com o RabbitMQ e o Node.js

Este artigo tem como objetivo o uso do sistema de mensageria RabbitMQ e a integração com o Node para o consumo de suas filas em miscroserviços de API´s. 

O que é o RabbitMQ?

RabbitMQ é um sistema de mensageria de código aberto baseado no protocolo AMQP (Advanced Message Queuing Protocol) que permite a comunicação entre aplicativos e serviços distribuídos.

O RabbitMQ funciona como um intermediário entre os emissores e receptores de mensagens, que se conectam ao sistema através de canais de comunicação chamados “filas”. As mensagens são enviadas para uma fila e, em seguida, o RabbitMQ as entrega ao destinatário apropriado.

O RabbitMQ oferece suporte a diversos recursos avançados, como filas de mensagens prioritárias, roteamento de mensagens baseado em padrões de troca e confirmações de entrega de mensagens. Além disso, ele permite a escalabilidade horizontal do sistema, adicionando novos nós de processamento de mensagens para lidar com o aumento de carga.

O RabbitMQ é amplamente utilizado em sistemas distribuídos, microserviços e aplicativos em nuvem, onde a comunicação entre componentes é essencial. Ele é suportado por uma grande comunidade de desenvolvedores e tem uma ampla gama de bibliotecas de cliente para várias linguagens de programação.

No entanto, é importante notar que o RabbitMQ pode exigir uma configuração mais avançada e pode ser mais complexo de usar do que outros sistemas de mensageria, dependendo do caso de uso.

Um exemplo sobre o uso do RabbitMQ 

Um exemplo de uso prático do RabbitMQ seria em um sistema de processamento de pedidos online. Suponha que um aplicativo web recebe pedidos de usuários e precisa enviar esses pedidos para um sistema de processamento em tempo real. O RabbitMQ pode ser usado para enviar esses pedidos de forma assíncrona e escalável.

O fluxo de trabalho seria o seguinte: quando um pedido é feito pelo usuário, o aplicativo web adiciona esse pedido a uma fila no RabbitMQ. Em seguida, um ou mais sistemas de processamento se conectam ao RabbitMQ e recebem esses pedidos da fila. Os sistemas de processamento podem processar vários pedidos simultaneamente, pois o RabbitMQ gerencia o equilíbrio de carga entre os processadores.

O RabbitMQ também fornece recursos de confirmação de entrega, garantindo que cada pedido seja entregue e processado com sucesso. Se um sistema de processamento não puder processar um pedido, o RabbitMQ pode redirecioná-lo para uma fila de “pedidos com falha”, onde ele pode ser inspecionado e tratado posteriormente.

VAI GOSTAR: Usabilidade nas mensagens de erro

Além disso, o RabbitMQ pode ser configurado para lidar com situações de pico de tráfego, adicionando mais nós de processamento para lidar com a carga adicional de pedidos. Isso permite que o sistema seja escalado horizontalmente de forma transparente e sem interrupção.

Esse é apenas um exemplo de como o RabbitMQ pode ser usado em um sistema distribuído. A flexibilidade e os recursos avançados do RabbitMQ permitem que ele seja usado em uma ampla variedade de casos de uso, desde aplicativos de mensagens em tempo real até sistemas de processamento de dados em larga escala.

RabbitMQ Vs. Kafka

RabbitMQ e Kafka são duas soluções de mensageria populares que oferecem recursos semelhantes, mas abordagens diferentes para gerenciar a comunicação entre aplicativos. Aqui estão algumas das principais diferenças entre eles:

Modelo de mensageria: RabbitMQ é baseado em um modelo de mensageria tradicional, com trocas, filas e rotas definidas pelo usuário. Kafka, por outro lado, é baseado em um modelo de publicação/subscrição, onde os produtores publicam mensagens em tópicos e os consumidores se inscrevem nesses tópicos para receber as mensagens.

Escalabilidade: Kafka é conhecido por sua escalabilidade horizontal, permitindo que grandes quantidades de dados sejam processados em tempo real. RabbitMQ também é escalável, mas geralmente é mais adequado para cargas de trabalho menores.

Velocidade: Kafka é conhecido por ser mais rápido do que o RabbitMQ em situações de alto volume de dados, devido ao seu modelo de mensageria orientado a eventos e sua arquitetura distribuída.

Durabilidade: Ambos os sistemas oferecem mecanismos de durabilidade, mas com abordagens diferentes. O RabbitMQ usa filas persistentes para garantir a entrega de mensagens, enquanto o Kafka armazena as mensagens em disco em clusters replicados para garantir a disponibilidade.

Complexidade: O RabbitMQ é considerado mais fácil de configurar e gerenciar do que o Kafka, que pode ser mais complexo devido à sua arquitetura distribuída e ao seu modelo de mensageria.

Em geral, a escolha entre RabbitMQ e Kafka dependerá das necessidades específicas do seu aplicativo. O RabbitMQ é uma boa escolha para aplicações com volumes menores de dados e que exigem um modelo de mensageria mais tradicional, enquanto o Kafka é mais adequado para cargas de trabalho de alto volume e em tempo real. Ambos são sistemas populares e bem testados que oferecem recursos poderosos para a comunicação de aplicativos distribuídos.

Como configurar o RabbitMQ?

Configurar o RabbitMQ envolve várias etapas que incluem a instalação do software e a configuração dos recursos necessários para o uso, como trocas, filas e usuários. Aqui estão os passos básicos para configurar o RabbitMQ:

Instalação: Baixe e instale o RabbitMQ em sua máquina ou servidor seguindo as instruções do site oficial do RabbitMQ ou do seu sistema operacional. Verifique se o serviço está em execução e acessível na porta padrão (5672).

Gerenciamento: O RabbitMQ inclui um painel de gerenciamento da Web que pode ser acessado em http://localhost:15672 (substitua “localhost” pelo nome do servidor se estiver executando remotamente). Faça login usando as credenciais padrão (usuário “guest” e senha “guest”).

Usuários: Crie usuários e senhas para acessar o RabbitMQ. Na seção “Admin”, selecione “Users” e adicione um novo usuário com as permissões necessárias. É altamente recomendável usar senhas fortes.

Trocas: Crie trocas para encaminhar as mensagens. Na seção “Admin”, selecione “Exchanges” e adicione uma nova troca, escolhendo o tipo adequado para suas necessidades (direto, tópico, fanout ou headers).

Filas: Crie filas para armazenar as mensagens. Na seção “Admin”, selecione “Queues” e adicione uma nova fila, atribuindo-a à troca adequada.

Vinculação: Crie vinculações entre as trocas e filas. Na seção “Admin”, selecione “Bindings” e adicione uma nova vinculação, especificando a troca e a fila adequadas.

Acesso: Defina as permissões de acesso para os usuários e objetos. Na seção “Admin”, selecione “Permissions” e adicione as permissões necessárias para cada usuário.

Configurações avançadas: Configure outras opções avançadas, como políticas de tempo de vida, confirmações de entrega, logs e muito mais, conforme necessário.

Esses são apenas os passos básicos para configurar o RabbitMQ. A configuração pode variar dependendo das necessidades específicas do seu aplicativo. É altamente recomendável ler a documentação oficial do RabbitMQ e seguir as melhores práticas para garantir um ambiente seguro e confiável.

Leia a documentação do RabbitMQ.

O que é a biblioteca amqplib do Node para o RabbitMQ

Integrar o RabbitMQ com o Node.js é bastante simples, pois existem diversas bibliotecas de cliente disponíveis para essa finalidade. A principal biblioteca para Node é o amqplib.

A biblioteca amqplib é uma biblioteca de cliente RabbitMQ escrita em JavaScript para uso em aplicativos Node.js. Ele permite que os desenvolvedores criem aplicativos que se comuniquem com servidores RabbitMQ usando a API do protocolo AMQP.

A biblioteca amqplib oferece suporte a recursos avançados do RabbitMQ, como trocas de mensagens, filas, roteamento de mensagens, confirmações de entrega e gerenciamento de canais de comunicação. Ele também oferece recursos de segurança, como SSL e autenticação.

Aqui estão alguns dos principais recursos da biblioteca amqplib:

Suporte para o protocolo AMQP 0-9-1

Suporte para mensagens assíncronas e síncronas

Suporte para diferentes tipos de trocas, como “direct”, “topic”, “fanout” e “headers”

Suporte para filas exclusivas e duráveis

Suporte para roteamento de mensagens baseado em chaves

Suporte para confirmar a entrega de mensagens

Suporte para gerenciamento de canais de comunicação

Suporte para autenticação e SSL

A biblioteca amqplib é uma das bibliotecas de cliente RabbitMQ mais populares disponíveis para Node.js. É de código aberto e está disponível sob a licença MIT. É atualizado regularmente e tem uma comunidade ativa de usuários e desenvolvedores. A documentação é abrangente e bem escrita, com muitos exemplos de código e informações sobre como usar a biblioteca em conjunto com o RabbitMQ.

Veja a documentação da bliblioteca amqplib.

Exemplo de como integrar o RabbitMQ com o Node.js utilizando a biblioteca amqplib

Integrar o RabbitMQ com o Node.js é bastante simples, pois existem diversas bibliotecas de cliente disponíveis para essa finalidade. Vou descrever um exemplo de integração usando a biblioteca amqplib.

  1. Instale a biblioteca amqplib usando o npm:
npm install amqplib
  1. Importe a biblioteca no seu código:
const amqp = require('amqplib');
  1. Crie uma conexão com o servidor RabbitMQ:
const connection = await amqp.connect('amqp://localhost');
  1. Crie um canal de comunicação:
const channel = await connection.createChannel();
  1. Crie uma fila para receber as mensagens:
const queueName = 'minha-fila';
await channel.assertQueue(queueName, { durable: false });
  1. Publique uma mensagem na fila:
const mensagem = 'Olá, mundo!';
channel.sendToQueue(queueName, Buffer.from(mensagem));
  1. Consuma as mensagens da fila:
channel.consume(queueName, (mensagem) => {
console.log(`Recebido: ${mensagem.content.toString()}`);
channel.ack(mensagem);
});

No exemplo acima, a mensagem é consumida da fila e a confirmação de entrega é enviada de volta para o servidor RabbitMQ usando o método channel.ack(). Isso garante que a mensagem seja removida da fila apenas após ser processada com sucesso.

VAI GOSTAR? LocalStack: simule ambientes AWS localmente

Esse é apenas um exemplo básico de como integrar o RabbitMQ com o Node.js. A biblioteca amqplib oferece recursos avançados para trabalhar com diferentes tipos de troca, filas, confirmações de entrega, entre outros. É importante ler a documentação da biblioteca para entender melhor como usá-la de forma mais eficiente.

Exemplo de uso avançado de RabbitMQ com o Node

Vamos supor que temos um sistema de processamento de imagens distribuído, onde vários trabalhadores (nós de processamento) processam várias tarefas (processamento de imagens). O objetivo é distribuir essas tarefas de forma equilibrada entre os trabalhadores, escalando horizontalmente quando necessário.

  1. Crie uma conexão com o servidor RabbitMQ:
const connection = await amqp.connect('amqp://localhost');
  1. Crie um canal de comunicação:
const channel = await connection.createChannel();
  1. Crie uma troca de mensagens com o tipo “fanout”:
const exchangeName = 'imagens';
await channel.assertExchange(exchangeName, 'fanout', { durable: false });
  1. Crie uma fila exclusiva para cada trabalhador:
const queue = await channel.assertQueue('', { exclusive: true });
  1. Faça a ligação entre a troca e as filas:
await channel.bindQueue(queue.queue, exchangeName, '');
  1. Inicie o consumo das mensagens:
channel.consume(queue.queue, (mensagem) => {
const imagem = JSON.parse(mensagem.content.toString());
console.log(`Processando imagem ${imagem.nome}...`);
// processa a imagem aqui
channel.ack(mensagem);
});

No exemplo acima, a troca imagens é criada com o tipo “fanout”, o que significa que todas as mensagens enviadas para essa troca serão entregues a todas as filas vinculadas a ela. Uma fila exclusiva é criada para cada trabalhador, que se liga à troca imagens para receber mensagens.

Quando uma mensagem é enviada para a troca imagens, ela é entregue a todas as filas vinculadas a ela. O RabbitMQ garante que as mensagens sejam distribuídas de forma equilibrada entre as filas. O método channel.consume() é usado para iniciar o consumo de mensagens de uma fila específica, onde cada trabalhador pode consumir uma fila exclusiva.

Esse é apenas um exemplo de como usar recursos avançados do RabbitMQ em conjunto com o Node.js. A biblioteca amqplib oferece uma ampla gama de recursos, como trocas de mensagens de diferentes tipos, filas prioritárias, confirmações de entrega e muito mais. É importante ler a documentação da biblioteca e do RabbitMQ para entender melhor como usá-los de forma mais eficiente.

Quais são as vantagens e desvantagens em utilizar o RabbitMQ?

O RabbitMQ é um sistema de mensageria poderoso e flexível, e quando usado em conjunto com o Node.js, pode fornecer várias vantagens. No entanto, também existem algumas desvantagens a serem consideradas.

Vantagens:

Escalabilidade: O RabbitMQ permite que você distribua tarefas entre várias instâncias do Node.js. Isso pode ajudar a melhorar o desempenho e a escalabilidade do seu aplicativo.

Flexibilidade: O RabbitMQ suporta vários padrões de mensageria, incluindo filas, trocas, tópicos e muito mais. Isso oferece muita flexibilidade ao projetar sistemas de comunicação.

Confiabilidade: O RabbitMQ é altamente confiável, garantindo que as mensagens sejam entregues de forma confiável e com confirmação. Isso ajuda a garantir que o processamento de tarefas e comunicação seja robusto.

Modularidade: O RabbitMQ é um sistema de mensageria modular, permitindo que você escolha e use apenas os recursos que precisa. Isso pode ajudar a reduzir a complexidade do código e tornar o aplicativo mais fácil de manter.

Desvantagens:

Complexidade: O uso do RabbitMQ pode adicionar alguma complexidade ao aplicativo, especialmente se você precisar usar recursos avançados. Isso pode tornar o código mais difícil de entender e manter.

Configuração: O RabbitMQ requer configuração adequada, que pode ser demorada e difícil de entender para usuários iniciantes.

Desempenho: Dependendo da carga e do tipo de aplicativo, o uso do RabbitMQ pode afetar o desempenho. O processamento de mensagens adiciona alguma sobrecarga à comunicação, embora seja geralmente negligenciável.

Dependência externa: O uso do RabbitMQ pode significar que você precisa de um componente adicional em seu sistema e, portanto, terá uma dependência externa. Isso pode tornar o sistema mais difícil de implantar e manter.

Em resumo, o uso do RabbitMQ em conjunto com o Node.js pode trazer muitos benefícios, incluindo escalabilidade, flexibilidade e confiabilidade. No entanto, também pode adicionar alguma complexidade e sobrecarga de configuração, além de depender de uma dependência externa. É importante pesar esses fatores ao decidir se o RabbitMQ é a solução certa para o seu aplicativo.

RabbitMQ ou o Azure Service Bus?

RabbitMQ e Azure Service Bus são duas soluções de mensageria populares, cada uma com suas próprias vantagens e desvantagens. Aqui estão algumas diferenças entre eles:

Modelo de mensageria: RabbitMQ usa um modelo de troca e fila, enquanto o Azure Service Bus usa um modelo de filas e tópicos. No modelo de troca e fila, as mensagens são encaminhadas por meio de trocas, que direcionam a mensagem para a fila correta. Já no modelo de filas e tópicos, as mensagens são enviadas para uma fila ou tópico, e os assinantes recebem todas as mensagens publicadas no tópico ou apenas mensagens com certas propriedades.

Disponibilidade global: O Azure Service Bus é uma solução em nuvem da Microsoft, o que significa que oferece recursos para garantir alta disponibilidade, como replicação geográfica de dados e failover automático entre regiões. Já o RabbitMQ pode ser implantado em um ambiente de nuvem, mas depende da infraestrutura e configuração da hospedagem.

Escalabilidade: Ambas as soluções são escaláveis e podem lidar com cargas de trabalho pesadas. O Azure Service Bus tem um limite superior de tamanho de mensagem maior do que o RabbitMQ, o que pode ser uma vantagem em cargas de trabalho com muitos dados.

Protocolos suportados: O RabbitMQ suporta vários protocolos de mensageria, como AMQP, STOMP e MQTT, enquanto o Azure Service Bus suporta principalmente o protocolo AMQP e outras APIs do Microsoft Azure.

Preço: O Azure Service Bus é uma solução em nuvem, o que significa que o custo é baseado no uso e na quantidade de dados transferidos. O RabbitMQ é uma solução de código aberto e gratuita, mas requer infraestrutura e configuração.

Em geral, a escolha entre RabbitMQ e Azure Service Bus dependerá das necessidades específicas do seu aplicativo. Se a disponibilidade global e o modelo de filas e tópicos são importantes, o Azure Service Bus pode ser a melhor opção. Se a escalabilidade, flexibilidade de protocolos e custo são mais importantes, o RabbitMQ pode ser a melhor escolha.

LEIA TAMBÉM

Ramos da Informática
Ramos da Informáticahttps://ramosdainformatica.com.br
Ramos da Informática é um hub de comunidade sobre linguagens de programação, banco de dados, DevOps, Internet das Coisas, tecnologia da indústria 4.0, Cyber Segurança e Startups.
ARTIGOS RELACIONADOS
- Advertisment -spot_img

MAIS LIDOS

Sua assinatura não pôde ser validada.
Você fez sua assinatura com sucesso.

E-Zine Ramos da Informática

Assine o E-Zine e tenha Conteúdo Exclusivo, Concursos para assinantes, descontos exclusivos e uma área de conteúdos exclusivos só do E-zine.