Fehlerbehebung — NATS
Verlorene Nachrichten (kein JetStream)
Ursache: JetStream ist nicht aktiviert oder es ist kein Stream konfiguriert, um die Nachrichten zu erfassen. Ohne JetStream arbeitet NATS im Fire-and-Forget-Modus: Nachrichten werden nur an zum Zeitpunkt der Veröffentlichung verbundene Abonnenten zugestellt.
Lösung:
- Überprüfen Sie, ob JetStream in Ihrem Manifest aktiviert ist:
nats.yaml
jetstream:
enabled: true
size: 10Gi - Wenden Sie das Manifest bei Bedarf erneut an:
kubectl apply -f nats.yaml - Erstellen Sie einen Stream, um die Nachrichten der gewünschten Subjects zu erfassen:
nats stream add --subjects "orders.>" --storage file --replicas 3 --retention limits orders-stream - Überprüfen Sie, ob der Stream erstellt wurde und Nachrichten erfasst:
nats stream info orders-stream
Consumer empfängt keine Nachrichten
Ursache: Der Consumer ist auf ein Subject abonniert, das nicht dem vom Produzenten verwendeten entspricht. Häufige Fehler sind ein Tippfehler im Subject-Namen, eine falsche Verwendung von Wildcards oder eine fehlerhafte Queue-Group-Konfiguration.
Lösung:
- Überprüfen Sie das genaue Subject, das vom Produzenten und Consumer verwendet wird — Subjects sind case-sensitive
- Testen Sie den Empfang mit einem Diagnose-Abonnement:
Dies ermöglicht es, alle Nachrichten auf dem Server zu sehen
nats sub ">" - Überprüfen Sie die verwendeten Wildcards:
orders.*matcht nichtorders.new.urgent(verwenden Sieorders.>für Unterebenen)
- Wenn Sie Queue Groups verwenden, überprüfen Sie, ob der Consumer Mitglied der erwarteten Gruppe ist und der Gruppenname identisch ist
JetStream-Speicher voll
Ursache: Das JetStream-Volume hat seine maximale Kapazität erreicht (jetstream.size). Neue Nachrichten können nicht mehr persistiert werden und Veröffentlichungen schlagen fehl.
Lösung:
- Überprüfen Sie die JetStream-Speichernutzung:
nats account info - Identifizieren Sie die größten Streams:
nats stream list - Löschen Sie alte Nachrichten aus Streams, die dies erlauben:
nats stream purge <stream-name> - Überprüfen Sie die Aufbewahrungsrichtlinie der Streams — verwenden Sie
limitsmitmax-age, um alte Nachrichten automatisch zu löschen:nats stream edit <stream-name> --max-age 72h - Erhöhen Sie bei Bedarf
jetstream.sizein Ihrem Manifest:nats.yamljetstream:
enabled: true
size: 50Gi
Unzureichender Arbeitsspeicher
Ursache: Der NATS-Server verbraucht mehr Speicher als das zugewiesene Limit, oft aufgrund einer hohen Anzahl von Verbindungen, großer Nachrichten (max_payload zu hoch) oder JetStream-Streams im Speicher.
Lösung:
- Überprüfen Sie die Pod-Ereignisse, um einen OOMKill zu bestätigen:
kubectl describe pod <pod-nats> | grep -A 5 "Last State" - Erhöhen Sie die NATS zugewiesenen Ressourcen:
nats.yaml
replicas: 3
resources:
cpu: 1
memory: 2Gi - Überprüfen Sie den Wert von
max_payloadinconfig.merge— reduzieren Sie ihn, wenn sehr große Nachrichten nicht erforderlich sind - Wenden Sie das Manifest erneut an:
kubectl apply -f nats.yaml
Verbindung abgelehnt
Ursache: Der Client kann keine Verbindung zum NATS-Server herstellen. Dies kann an nicht gestarteten Pods, falschen Zugangsdaten oder einem externen Verbindungsversuch ohne external: true liegen.
Lösung:
- Überprüfen Sie, ob die NATS-Pods im Status
Runningsind:kubectl get pods -l app.kubernetes.io/component=nats - Überprüfen Sie die Pod-Logs auf Fehler:
kubectl logs <pod-nats> - Überprüfen Sie die Benutzerzugangsdaten im Kubernetes Secret:
kubectl get tenantsecret <nats-name>-credentials -o jsonpath='{.data}' | base64 -d - Wenn Sie sich von außerhalb des Clusters verbinden, stellen Sie sicher, dass
external: truekonfiguriert ist:nats.yamlexternal: true - Testen Sie die Konnektivität von einem Pod innerhalb des Clusters:
kubectl exec <pod-nats> -- nats-server --help 2>&1 | head -1