DEV Community

Cover image for Guia Completo: Mensageria com Node.js
Lucas Pereira de Souza
Lucas Pereira de Souza

Posted on

2

Guia Completo: Mensageria com Node.js

A mensageria em Node.js é uma prática essencial para criar sistemas escaláveis, resilientes e assíncronos, especialmente em arquiteturas baseadas em microsserviços. Este guia abrange desde os conceitos fundamentais até a implementação prática com bibliotecas populares como RabbitMQ e Kafka.


1. O que é Mensageria e Por que Utilizá-la?

Mensageria é o processo de enviar, receber e gerenciar mensagens entre serviços ou componentes de software. É útil para:

  • Desacoplamento: Permite que os serviços sejam independentes.
  • Escalabilidade: Gerencia alta carga de tráfego distribuindo mensagens.
  • Resiliência: Garante o processamento de mensagens mesmo em caso de falhas temporárias.

Cenários Comuns de Uso:

  • Fila de tarefas (background jobs).
  • Comunicação entre microsserviços.
  • Processamento em tempo real, como rastreamento de atividades.

2. Configurando um Ambiente Node.js

  1. Instale o Node.js: Certifique-se de ter o Node.js instalado na versão mais recente.
  2. Gerenciador de pacotes: Use npm ou yarn para instalar dependências.
  3. Dependências básicas:
    • dotenv para variáveis de ambiente.
    • amqplib ou kafkajs para comunicação com serviços de mensageria.
npm install dotenv amqplib
Enter fullscreen mode Exit fullscreen mode

3. Protocolos e Ferramentas de Mensageria

RabbitMQ:

RabbitMQ é um broker AMQP amplamente utilizado para troca de mensagens.

  • Usado para filas e troca de mensagens (direct, topic, fanout, headers).
  • Facilita padrões como RPC (Remote Procedure Call) e Pub/Sub.

Apache Kafka:

Ideal para streaming de dados em grande escala.

  • Orientado a eventos.
  • Alta performance para processamento em tempo real.

Outras Opções:

  • Redis Streams: Mais simples e rápido para casos específicos.
  • MQTT: Usado em IoT para comunicação leve entre dispositivos.

4. Implementação Básica com RabbitMQ

Passo 1: Configurar um Servidor RabbitMQ

  • Instale e execute o RabbitMQ (local ou em container Docker):
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management
Enter fullscreen mode Exit fullscreen mode

Passo 2: Conectar ao RabbitMQ

Utilize a biblioteca amqplib para criar uma conexão e uma fila.

const amqp = require('amqplib');

async function connect() {
  try {
    const connection = await amqp.connect('amqp://localhost');
    const channel = await connection.createChannel();
    const queue = 'tasks';

    await channel.assertQueue(queue, { durable: true });

    console.log(`Waiting for messages in ${queue}`);
    channel.consume(queue, (msg) => {
      console.log(`Received: ${msg.content.toString()}`);
      channel.ack(msg);
    });
  } catch (err) {
    console.error('Error:', err);
  }
}

connect();
Enter fullscreen mode Exit fullscreen mode

5. Implementação com Kafka

Kafka requer a biblioteca kafkajs.

Configuração Inicial

  1. Instale o Kafka localmente ou com Docker.
  2. Instale a biblioteca:
   npm install kafkajs
Enter fullscreen mode Exit fullscreen mode

Produtor e Consumidor com KafkaJS

Produtor:

const { Kafka } = require('kafkajs');

const kafka = new Kafka({ clientId: 'my-app', brokers: ['localhost:9092'] });

const producer = kafka.producer();

async function sendMessage() {
  await producer.connect();
  await producer.send({
    topic: 'test-topic',
    messages: [{ value: 'Hello KafkaJS' }],
  });
  await producer.disconnect();
}

sendMessage();
Enter fullscreen mode Exit fullscreen mode

Consumidor:

const consumer = kafka.consumer({ groupId: 'test-group' });

async function consumeMessages() {
  await consumer.connect();
  await consumer.subscribe({ topic: 'test-topic', fromBeginning: true });

  await consumer.run({
    eachMessage: async ({ topic, partition, message }) => {
      console.log({
        partition,
        value: message.value.toString(),
      });
    },
  });
}

consumeMessages();
Enter fullscreen mode Exit fullscreen mode

6. Boas Práticas

  1. Gerenciar erros: Garanta que erros sejam tratados e mensagens reenviadas.
  2. Idempotência: Assegure que o processamento de mensagens seja idempotente.
  3. Monitore o sistema: Use ferramentas como Prometheus e Grafana para rastrear métricas.

7. Recursos Complementares

  • Documentação oficial de RabbitMQ e KafkaJS.
  • Estude Clean Architecture para organizar sistemas de mensageria【6】【7】【8】.

Com estas etapas, você terá uma aplicação robusta para lidar com mensageria no Node.js, pronta para escalar e atender às demandas modernas. Se precisar de ajuda para um caso específico, sinta-se à vontade para perguntar!

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

Cloudinary image

Optimize, customize, deliver, manage and analyze your images.

Remove background in all your web images at the same time, use outpainting to expand images with matching content, remove objects via open-set object detection and fill, recolor, crop, resize... Discover these and hundreds more ways to manage your web images and videos on a scale.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay