Risoluzione dei problemi — NATS
Messaggi persi (senza JetStream)
Causa: JetStream non è attivato o nessuno stream è configurato per catturare i messaggi. Senza JetStream, NATS funziona in modalità fire-and-forget: i messaggi vengono consegnati solo agli iscritti connessi al momento della pubblicazione.
Soluzione:
- Verificate che JetStream sia attivato nel vostro manifesto:
nats.yaml
jetstream:
enabled: true
size: 10Gi - Riapplicate il manifesto se necessario:
kubectl apply -f nats.yaml - Create uno stream per catturare i messaggi dei subject desiderati:
nats stream add --subjects "orders.>" --storage file --replicas 3 --retention limits orders-stream - Verificate che lo stream sia stato creato e catturi i messaggi:
nats stream info orders-stream
Il consumer non riceve i messaggi
Causa: il consumer è iscritto a un subject che non corrisponde a quello utilizzato dal produttore. Gli errori comuni includono un errore di battitura nel nome del subject, un uso errato dei wildcard, o una configurazione di queue group non corretta.
Soluzione:
- Verificate il subject esatto utilizzato dal produttore e dal consumer — i subject sono sensibili alle maiuscole/minuscole
- Testate la ricezione con un abbonamento di diagnostica:
Questo consente di vedere tutti i messaggi pubblicati sul server
nats sub ">" - Verificate i wildcard utilizzati:
orders.*non corrisponde aorders.new.urgent(utilizzateorders.>per i sotto-livelli)
- Se utilizzate i queue group, verificate che il consumer sia membro del gruppo atteso e che il nome del gruppo sia identico
Archiviazione JetStream piena
Causa: il volume JetStream ha raggiunto la sua capacità massima (jetstream.size). I nuovi messaggi non possono più essere persistiti e le pubblicazioni falliscono.
Soluzione:
- Verificate l'utilizzo dell'archiviazione JetStream:
nats account info - Identificate gli stream più voluminosi:
nats stream list - Eliminate i vecchi messaggi dagli stream che lo consentono:
nats stream purge <nome-stream> - Verificate la politica di retention degli stream — utilizzate
limitsconmax-ageper eliminare automaticamente i vecchi messaggi:nats stream edit <nome-stream> --max-age 72h - Se necessario, aumentate
jetstream.sizenel vostro manifesto:nats.yamljetstream:
enabled: true
size: 50Gi
Memoria insufficiente
Causa: il server NATS consuma più memoria del limite allocato, spesso a causa di un numero elevato di connessioni, di messaggi voluminosi (max_payload troppo elevato), o di stream JetStream in memoria.
Soluzione:
- Verificate gli eventi del pod per confermare un OOMKill:
kubectl describe pod <pod-nats> | grep -A 5 "Last State" - Aumentate le risorse allocate a NATS:
nats.yaml
replicas: 3
resources:
cpu: 1
memory: 2Gi - Verificate il valore di
max_payloadinconfig.merge— riducetelo se i messaggi molto voluminosi non sono necessari - Riapplicate il manifesto:
kubectl apply -f nats.yaml
Connessione rifiutata
Causa: il client non riesce a connettersi al server NATS. Questo può essere dovuto a pod non avviati, credenziali errate, o un tentativo di connessione esterna senza external: true.
Soluzione:
- Verificate che i pod NATS siano nello stato
Running:kubectl get pods -l app.kubernetes.io/component=nats - Consultate i log del pod per identificare gli errori:
kubectl logs <pod-nats> - Verificate le credenziali utente nel Secret Kubernetes:
kubectl get tenantsecret <nome-nats>-credentials -o jsonpath='{.data}' | base64 -d - Se vi connettete dall'esterno del cluster, assicuratevi che
external: truesia configurato:nats.yamlexternal: true - Testate la connettività da un pod nel cluster:
kubectl exec <pod-nats> -- nats-server --help 2>&1 | head -1