TL;DR — Resumo Rápido

NATS oferece mensagens cloud-native ultra-rápidas e streaming durável. Aprenda pub/sub, JetStream, KV store, clustering e autenticação para microsserviços.

NATS é uma tecnologia de conectividade criada para aplicações cloud-native. Um único binário sem dependências que processa milhões de mensagens por segundo com latências sub-milissegundo — e acrescenta JetStream para streaming durável, armazenamento Key-Value e Object Store na mesma infraestrutura.

Pré-requisitos

  • Docker ou um host Linux com wget/curl.
  • O CLI nats: curl -sf https://binaries.nats.dev/nats-io/natscli/nats@latest | sh
  • Familiaridade básica com conceitos de mensagens publish/subscribe.
  • Para Kubernetes: Helm 3 e um cluster em execução.

Passo 1: Instalar o nats-server

Docker (mais rápido)

docker run -d --name nats \
  -p 4222:4222 -p 8222:8222 \
  nats:latest -js -m 8222

nats server ping

Binário (Linux)

curl -L https://github.com/nats-io/nats-server/releases/latest/download/nats-server-v2.10.14-linux-amd64.zip -o nats.zip
unzip nats.zip && sudo mv nats-server /usr/local/bin/
nats-server --jetstream --http_port 8222

Kubernetes (Helm)

helm repo add nats https://nats-io.github.io/k8s/helm/charts/
helm install nats nats/nats \
  --set config.jetstream.enabled=true \
  --set config.cluster.enabled=true \
  --set replicaCount=3

Passo 2: NATS Core — Pub/Sub, Request/Reply e Grupos de Fila

NATS core é at-most-once: mensagens são entregues apenas a assinantes ativos. É rápido porque não há overhead de persistência.

Endereçamento Baseado em Assuntos

Assuntos são strings hierárquicas delimitadas por pontos:

TokenCorresponde aExemplo
*Um único tokenorders.*.placed corresponde a orders.eu.placed
>Todos os tokens restantesorders.> corresponde a orders.eu.placed, orders.us.updated
# Terminal 1 — assinar
nats sub "orders.>"

# Terminal 2 — publicar
nats pub orders.us.placed '{"id":"1001","valor":99.00}'

Grupos de Fila — Balanceamento de Carga

nats sub --queue processadores "orders.>"   # terminal 1
nats sub --queue processadores "orders.>"   # terminal 2
nats pub orders.us.placed '{"id":"1003"}'

Padrão Request/Reply

# Serviço (lado resposta)
nats reply "estoque.verificar" '{"disponivel": true, "qtd": 42}'

# Cliente (lado requisição)
nats request "estoque.verificar" '{"sku":"WIDGET-A"}'

Passo 3: JetStream — Streaming Durável

JetStream armazena mensagens em streams. Um stream captura mensagens correspondentes a um ou mais assuntos e as retém conforme uma política de retenção.

Criar um Stream

nats stream add PEDIDOS \
  --subjects "orders.>" \
  --storage file \
  --retention limits \
  --max-msgs 1000000 \
  --max-age 7d \
  --replicas 3

Backends de armazenamento:

BackendCaso de uso
filePersistência entre reinicializações, grandes conjuntos de dados
memoryLatência ultra-baixa, cargas de trabalho tipo cache

Políticas de retenção:

PolíticaComportamento
limitsRetém até atingir limites de tamanho/idade/quantidade
interestRetém enquanto existir pelo menos um consumidor
workqueueExclui cada mensagem após confirmação por um consumidor

Consumidores Push vs Pull

# Consumidor push durável
nats consumer add PEDIDOS fulfillment \
  --deliver-subject fulfillment.worker \
  --ack explicit --durable fulfillment

# Consumidor pull durável
nats consumer add PEDIDOS faturamento \
  --pull --ack explicit --durable faturamento

# Obter lote de 10 mensagens
nats consumer next PEDIDOS faturamento --count 10

Entrega Exactly-Once — Deduplicação

nats pub orders.us.placed \
  --header "Nats-Msg-Id: txn-abc-123" \
  '{"id":"1004","valor":200}'

nats stream edit PEDIDOS --dupe-window 5m

Dead Letter — Max Deliver

nats stream add DLQ \
  --subjects "\$JS.EVENT.ADVISORY.CONSUMER.MAX_DELIVERIES.PEDIDOS.*" \
  --storage file --retention limits

Passo 4: Key-Value Store

nats kv add CONFIG --history 10 --ttl 24h
nats kv put CONFIG db_url "postgres://prod-db:5432/app"
nats kv get CONFIG db_url
nats kv watch CONFIG

Passo 5: Object Store

nats object add ARTEFATOS --replicas 3
nats object put ARTEFATOS ./modelo-v2.bin
nats object get ARTEFATOS modelo-v2.bin ./modelo-baixado.bin

Passo 6: Autenticação e Autorização

Token (mais simples)

nats-server --auth meuTokenSecreto
nats pub assunto msg --server nats://meuTokenSecreto@localhost:4222

JWT Descentralizado com nsc

nsc add operator MinhaOrg
nsc add account AppA
nsc add user -a AppA alice
nsc generate creds -a AppA -n alice > alice.creds
nats pub assunto msg --creds alice.creds

Passo 7: Clustering e Leaf Nodes

Configuração de Cluster de 3 Nós

port: 4222
server_name: n1
jetstream: { store_dir: /data/nats }

cluster {
  name: prod
  port: 6222
  routes: [
    nats-route://nats-2:6222
    nats-route://nats-3:6222
  ]
}
nats server report jetstream
nats server list

Leaf Nodes para Conectividade na Borda

port: 4222
leafnodes {
  remotes: [{ url: "nats://hub-cluster:7422" }]
}

Passo 8: Monitoramento

curl http://localhost:8222/varz | jq .
curl http://localhost:8222/connz | jq .

Métricas Prometheus

docker run -d --name surveyor \
  -p 7777:7777 \
  natsio/nats-surveyor:latest \
  --servers nats://nats:4222 --port 7777

Adicione http://surveyor:7777/metrics como alvo de scrape do Prometheus. Importe o dashboard Grafana NATS (ID 14725).


NATS vs Alternativas

CaracterísticaNATS+JetStreamKafkaRabbitMQRedis Pub/SubPulsarMQTT
LatênciaSub-msms baixoms baixoSub-msms baixoSub-ms
ThroughputMuito altoMuito altoAltoAltoMuito altoMédio
PersistênciaJetStreamSimSimNãoSimOpcional
Exactly-onceJanela dedupTransaçõesNãoNãoSimNão
Request/Reply nativoSimNãoNãoNãoNãoNão
KV StoreIntegradoNãoNãoExternoNãoNão
Complexidade operacionalBaixaAltaMédiaBaixaAltaBaixa
Borda/IoTLeaf nodesNãoLimitadoNãoNãoSim

Exemplo Prático de Microsserviços

# 1. Criar stream de pedidos
nats stream add PEDIDOS --subjects "orders.>" --storage file --replicas 1

# 2. Serviço de estoque responde verificações
nats reply "estoque.verificar" '{"disponivel":true}'

# 3. Publicar pedido para processamento durável
nats pub orders.us.placed \
  --header "Nats-Msg-Id: $(uuidgen)" \
  '{"id":"2001","sku":"WIDGET-A","qtd":5}'

# 4. Trabalhador de fulfillment extrai do consumidor JetStream
nats consumer add PEDIDOS fulfillment --pull --ack explicit --durable fulfillment
nats consumer next PEDIDOS fulfillment --count 5

# 5. Armazenar estado no KV
nats kv put PEDIDOS "2001" '{"status":"cumprido","ts":"2026-03-23T10:00:00Z"}'

Armadilhas e Casos Extremos

  • JetStream não está habilitado por padrão. Sempre passe --jetstream ou configure jetstream: {}.
  • Réplicas exigem número ímpar de nós. Um cluster de 2 nós não consegue eleger meta-líder após uma falha.
  • Retenção interest sem consumidores exclui mensagens imediatamente. Crie o consumidor antes de publicar.
  • Consumidores pull precisam de acks explícitos. Configure max_deliver com valor finito.
  • A porta de monitoramento 8222 não é autenticada por padrão. Proteja com firewall.

Resumo

  • NATS core = pub/sub at-most-once, request/reply, grupos de fila — sem configuração, latência sub-ms.
  • JetStream adiciona persistência, entrega at-least-once/exactly-once, consumidores, KV e Object Store.
  • Use consumidores pull para filas de trabalhadores; push para leques de eventos.
  • Clusters de 3 nós são o mínimo para HA do JetStream; leaf nodes estendem à borda.
  • Monitore com o endpoint HTTP /varz, nats-surveyor e Grafana.

Artigos Relacionados