> ## 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.

# RabbitMQ e mensageria

> Documentacao completa das filas RabbitMQ: uso, processamento, retries e performance.

## 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`
