Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.pingoai.com.br/llms.txt

Use this file to discover all available pages before exploring further.

Visao geral da mensageria

O ExclusiveDay usa RabbitMQ em dois padroes principais:
  1. Event Bus (@node-ts/bus-rabbitmq) para comandos/eventos de dominio.
  2. RPC/Queue direta (rabbitmq-client) para chamadas diretas entre backend e channel.
Tambem existe processamento assíncrono em Redis/BullMQ para envio e ack de mensagens, que complementa o fluxo de performance.

1) Filas Event Bus (RabbitMQ)

backend-event-bus-queue

  • Servico dono da fila: backend
  • Origem da configuracao: RABBITMQ_QUEUE_NAME no backend
  • Uso: recebe eventos/comandos que o backend precisa tratar via handlers do bus.
  • Arquivo principal: Backend-1/src/bus.ts

channel-event-bus-queue

  • Servico dono da fila: channel
  • Origem da configuracao: RABBITMQ_QUEUE_NAME no channel
  • Uso: recebe comandos/eventos de integracao (Baileys/Meta/schedule/campaign handlers).
  • Arquivo principal: channel-2/src/bus-rabbitmq/bus-rabbitmq.ts

Como o Event Bus processa

  • Usa prefetch com concorrencia configurada pelo bus (withConcurrency(5)).
  • Mensagens podem ser persistentes (persistentMessages: true no channel).
  • Em erro, ocorre retorno para retry e depois DLQ quando estoura limite.
No transport customizado do channel (rabbitmq-transport.ts):
  • fila de retry: ${queueName}-retry
  • dead letter queue: dead_letter_queue (ou valor custom)
  • estrategia: nack para retry, e envio para DLQ ao atingir max retries.

2) Filas RPC diretas (RabbitMQ)

Estas filas sao usadas por chamadas request/response entre backend e channel.

check-contact-number-queue

  • Produtor: backend (CheckContactNumberProducer)
  • Consumidor: channel (CheckContactNumberConsumer)
  • Objetivo: validar se numero/grupo existe no canal.
  • Entrada: number, companyId, isGroup.
  • Saida: numero normalizado ou null.

get-profile-picture-queue

  • Produtor: backend (GetProfilePictureProducer)
  • Consumidor: channel (GetProfilePictureConsumer)
  • Objetivo: buscar foto de perfil no canal.
  • Entrada: number, companyId, whatsappId, contact?.
  • Saida: URL da foto; fallback para FRONTEND_URL/nopicture.png em erro.

create-or-update-contact-queue

  • Produtor: backend (CreateOrUpdateContactProducer)
  • Consumidor: channel (CreatOrUpdateContactConsumer)
  • Objetivo: criar/atualizar contato de forma centralizada no channel.
  • Entrada: whatsappId, name, number, isGroup, email, profilePicUrl, companyId, channel, extraInfo, remoteJid.
  • Saida: objeto de contato atualizado/criado.

notification-queue

  • Produtor: channel (NotificationProducer)
  • Consumidor: backend (NotificationConsumer)
  • Objetivo: entregar notificacoes para tempo real no frontend.
  • Entrada: namespace, channel, data.
  • Saida: done (ack RPC).
  • Efeito final: backend emite via Socket.IO para o namespace/canal informado.

flow-queue (implementada no producer)

  • Produtor encontrado: channel (FlowProducer).
  • Objetivo: enfileirar execucao de flow.
  • Status no codigo atual: producer encontrado; consumer nao localizado neste repositorio.
  • Observacao: documentar como fila em uso potencial/externo ate mapear consumidor definitivo.

3) Fluxo de processamento (fim a fim)

  1. Frontend envia acao via HTTP para backend.
  2. Backend publica comando/evento no Event Bus ou chama fila RPC.
  3. Channel processa integracao (ex.: numero/foto/contato, envio de mensagem).
  4. Channel responde RPC ou publica notificacao.
  5. Backend consome e publica no Socket.IO.
  6. Frontend recebe atualizacao em tempo real.

4) Performance e processamento

Controles presentes no codigo

  • Concorrencia do Event Bus: 5 handlers simultaneos (withConcurrency(5)).
  • Prefetch Rabbit: segue a concorrencia configurada no transport.
  • Retry Event Bus: maxRetries: 3 no backend/channel (config de bus).
  • Retry + DLQ custom (channel transport):
    • retry queue dedicada
    • dead letter queue dedicada
    • nack para retry; DLQ quando excede limite.
  • Publisher RPC com confirm: garante confirmacao de entrega no broker.

Pontos de custo/performance

  • rabbit.createRPCClient() e conexao por chamada nos producers pode elevar latencia sob alto volume.
  • RPC em cadeia para operacoes de contato/foto pode aumentar tempo de resposta de endpoints sincronos.
  • Falhas no consumidor podem aumentar backlog e acionar retries.
  • Fluxo de notificacao para Socket.IO depende da saude do consumer notification-queue.

Recomendacoes praticas de operacao

  1. Monitorar profundidade das filas no painel do RabbitMQ.
  2. Observar taxa de mensagens em retry e DLQ.
  3. Medir latencia de RPC (check-contact-number, get-profile-picture, create-or-update-contact).
  4. Validar capacidade de concorrencia por ambiente antes de aumentar withConcurrency.
  5. Em picos, considerar conexao/publisher reutilizavel para reduzir overhead.

5) Variaveis de ambiente relacionadas

  • RABBITMQ_URI
  • RABBITMQ_QUEUE_NAME
  • RABBITMQ_URI_INTERNAL (deploy)
  • RABBITMQ_QUEUE_NAME_BACKEND (deploy)
  • RABBITMQ_QUEUE_NAME_CHANNEL (deploy)

6) Filas Redis (complemento de processamento)

Embora nao sejam RabbitMQ, impactam diretamente throughput do sistema de mensagens:
  • message-queue-company-{id}
  • message-ack-queue-company-{id}
Comportamento atual (backend workers):
  • concurrency: 5
  • rate control: max 50 por 100ms
  • retry exponencial com attempts: 3
  • limpeza configurada de jobs concluídos/falhos

7) Arquivos de referencia

  • Backend-1/src/bus.ts
  • channel-2/src/bus-rabbitmq/bus-rabbitmq.ts
  • channel-2/src/bus-rabbitmq/rabbitmq-transport.ts
  • Backend-1/src/producers/check-contact-number.producer.ts
  • Backend-1/src/producers/get-profile-picture.producer.ts
  • Backend-1/src/producers/create-or-update-contact.producer.ts
  • channel-2/src/producers/notification.producer.ts
  • channel-2/src/producers/flow.producer.ts
  • channel-2/src/consumers/check-contact-number.consumer.ts
  • channel-2/src/consumers/get-profile-picture.consumer.ts
  • channel-2/src/consumers/create-or-update-contact.consumer.ts
  • Backend-1/src/consumers/notification.consumer.ts
  • Backend-1/src/queues/index.ts
  • Backend-1/src/queues/workers/make-message.worker.ts
  • Backend-1/src/queues/workers/make-message-ack.worker.ts