DEV Community

David Ortiz
David Ortiz

Posted on

Escalando Atendimento Multicanal

Escalando Atendimento Multicanal: Arquitetura de Mensageria e Webhooks em Tempo Real com Node.js e APIs da Meta

Como estruturar uma infraestrutura robusta para processamento de filas e alta volumetria de mensagens corporativas.

No cenário atual de desenvolvimento de software backend, garantir a entrega eficiente e em tempo real de mensagens para clientes deixou de ser um diferencial e virou um requisito crítico. Na CSI TECH Informática (csitech.com.br), enfrentamos frequentemente o desafio de projetar arquiteturas que lidam com picos elevados de requisições, exigindo alta disponibilidade e resiliência.

Neste artigo, vamos explorar as diretrizes fundamentais para estruturar um pipeline de comunicação baseado em microsserviços, utilizando Node.js, filas de mensageria e o tratamento assíncrono de webhooks voltados para o ecossistema de APIs da Meta (como o WhatsApp Business Platform).


1. O Desafio da Volumetria e Processamento Assíncrono

Quando operamos plataformas de atendimento que processam milhares de interações simultâneas, uma API síncrona tradicional inevitavelmente sofre gargalos. Se o servidor de destino da Meta disparar um webhook e a nossa aplicação demorar para responder ou travar, perdemos pacotes ou geramos timeouts desnecessários.

A solução ideal envolve o desacoplamento do recebimento e do processamento utilizando gerenciadores de filas (Message Queues) como o BullMQ aliado ao Redis.

Exemplo de Estruturação do Worker de Fila:


typescript
import { Worker, Job } from 'bullmq';
import axios from 'axios';

const connection = { host: 'localhost', port: 6379 };

const messageWorker = new Worker('whatsapp-queue', async (job: Job) => {
    const { recipientPhone, messagePayload } = job.data;

    try {
        // Envio estruturado para a API da Meta
        const response = await axios.post(
            `[https://graph.facebook.com/v17.0/YOUR_PHONE_NUMBER_ID/messages](https://graph.facebook.com/v17.0/YOUR_PHONE_NUMBER_ID/messages)`,
            messagePayload,
            { headers: { Authorization: `Bearer ${process.env.META_ACCESS_TOKEN}` } }
        );

        console.log(`Mensagem enviada com sucesso para ${recipientPhone}:`, response.data.messages[0].id);
    } catch (error) {
        console.error(`Falha ao despachar mensagem para ${recipientPhone}:`, error.message);
        throw error; // Permite que o BullMQ execute a política de retry automática
    }
}, { connection });

messageWorker.on('completed', (job) => {
    console.log(`Job ${job.id} processado com sucesso.`);
});
Enter fullscreen mode Exit fullscreen mode

Top comments (0)