Kafka, RabbitMQ, NATS.
kubectl apply - das ist alles.
Drei vollständig gemanagte Messaging-Dienste auf Hikube. Verteiltes Event-Streaming, PQAM-Task-Queues, ultraleichte Werbung/Sub. Automatische Replikation, koordinierter ZooKeeper, JetStream inklusive.
3 Dienste
Native HA
>1 ms
0 Konfig.
Der richtige Dienst für jedes Pattern
Kafka, RabbitMQ und NATS erfüllen unterschiedliche Anforderungen. Die Wahl hängt von der Menge, dem Liefermodell und der benötigten Haltbarkeit ab.
Jede Dienstleistung im Detail
Kafka
Kafka organisiert Nachrichten in Topics, die in Partitionen unterteilt und auf mehrere Broker verteilt sind. Jede Partition wird gemäß dem replicationFactor repliziert. Fällt ein Broker aus, werden die Partitionen auf die verfügbaren Replikate umgeleitet. ZooKeeper koordiniert die Wahl der Leader und speichert die Metadaten des Clusters.
Im Gegensatz zu RabbitMQ bewahrt Kafka die Nachrichten nach ihrem Verbrauch auf. Die Dauer der Speicherung kann pro Topic konfiguriert werden (retention.ms). Mehrere Consumer Groups können das gleiche Topic unabhängig voneinander lesen, wobei jede Gruppe ihren eigenen Offset beibehält.
- Topics deklariert im Manifest
Partitionen, Replikationsfaktor, Retention und Cleanup Policy direkt in YAML konfiguriert. Keine externen Tools zum Erstellen von Topics erforderlich. - Verwalteter ZooKeeper
3 ZooKeeper-Instanzen koordinieren den Cluster automatisch. Das ungerade Quorum ist garantiert ein Ausfall eines ZK-Knotens unterbricht den Dienst nicht. - Retention und Compact
cleanup.policy: delete löscht Nachrichten nach retention.ms. cleanup.policy: compact speichert nur die letzte Nachricht pro Schlüssel, ideal für Referenztabellen. - Optionale externe Exposition
external: true Erstellt einen LoadBalancer pro Broker für Clients außerhalb des Clusters. Vermeiden Sie dies ohne konfigurierte Authentifizierung.
apiVersion: apps.cozystack.io/v1alpha1
kind: Kafka
metadata:
name: example
spec:
external: false
kafka:
replicas: 3
resourcesPreset: small
size: 10Gi
storageClass: replicated
zookeeper:
replicas: 3 # Toujours impair
resourcesPreset: small
size: 5Gi
storageClass: replicated
topics:
- name: my-topic
partitions: 3
replicas: 3
config:
retention.ms: "604800000" # 7 jours
cleanup policy: "delete"
RabbitMQ
RabbitMQ routet Nachrichten über Exchanges - Producer posten an eine Exchange, die nach Binding-Regeln (direct, fanout, topic, headers) an die Queues verteilt. Die Consumer lesen von den Queues aus. Dieses flexible Routing-Modell macht RabbitMQ zur besten Wahl für komplexe Workflows, bei denen der Pfad einer Nachricht von ihrem Inhalt abhängt.
Mit 3 Replikaten verwendet RabbitMQ Quorum-Queues (Raft-Protokoll) - Nachrichten werden vor der Bestätigung repliziert, wodurch die Nachhaltigkeit auch bei Ausfall eines Knotens gewährleistet ist.
- Standard-Quorum-Queues
Raft-Replikation auf allen drei Knoten. Ein führender Knoten, zwei Followers. Ausfall eines Knotens ohne Verlust von Nachrichten. - Virtual hosts und Isolation.
Jeder vhost hat seine eigenen exchanges, queues und Berechtigungen. Nützlich, um Umgebungen (Produktion, Staging) auf einem Cluster zu trennen. - Management UI inbegriffen
Webinterface auf Port 15672 - Visualisierung von Queues, Exchange Bindings, Durchsatz in Echtzeit. Zugriff über Port-Forward oder LoadBalancer. - Multi-Protokolle
AMQP 0-9-1, AMQP 1.0, MQTT und STOMP werden nativ unterstützt.
apiVersion: apps.cozystack.io/v1alpha1
kind: RabbitMQ
metadata:
name: example
spec:
replicas: 3
resourcesPreset: small
size: 10Gi
storageClass: replicated
users:
admin:
password: "strongpassword"
vhosts:
production:
roles:
admin:
- admin
readonly:
- monitoring
staging:
roles:
admin:
- admin
readonly:
- monitoring
NATS
NATS ist das schlankste der drei Systeme - weniger als 10 MB RAM pro Instanz, die Latenz wird in Mikrosekunden gemessen. Nachrichten werden auf hierarchischen Subjekten (z. B. orders.created) veröffentlicht, die die Abonnenten abhören. Ohne JetStream funktioniert NATS als fire-and-forget: Nur Abonnenten, die zum Zeitpunkt der Veröffentlichung eingeloggt sind, erhalten die Nachricht.
JetStream fügt Persistenz hinzu - Nachrichten werden in Streams mit konfigurierbarer Speicherung, Wiedergabemöglichkeit und dauerhaften Consumer Groups mit Offset-Tracking gespeichert. Der Cluster verwendet Raft Consensus, um die Streams zu replizieren.
-
Pub/Sub und Request/Reply
Asynchrone (pub/sub) und synchrone (request/reply) Kommunikation mit demselben Broker. Das Pattern request/reply ermöglicht Aufrufe zwischen Microservices ohne HTTP. -
Queue Groups für das Load Balancing
Mehrere Instanzen desselben Dienstes in einer Queue Group teilen sich die Nachrichten - jede Nachricht wird nur von einem Mitglied der Gruppe bearbeitet. - Wildcards auf subjects
orders.* matcht eine Ebene, orders.> matcht alle Ebenen. Leistungsstarke Filterung ohne exchange-Konfiguration. -
JetStream ist optional
Aktivieren Sie JetStream nur, wenn Sie Persistenz benötigen. Für flüchtigen Pub/Sub (Benachrichtigungen, Echtzeitmetriken) ist Basis-NATS schlanker.
apiVersion: apps.cozystack.io/v1alpha1
kind: NATS
metadata:
name: example
spec:
replicas: 3
resourcesPreset: small
storageClass: replicated
external: false
jetstream:
enabled: true
size: 10Gi
users:
user1:
password: mypassword
config:
merge:
max_payload: 16MB
write_deadline: 2s
Was Sie nicht mehr tun müssen
Kafka, RabbitMQ und NATS sind drei verschiedene verteilte Systeme, aber sie teilen im selbstgehosteten Betrieb das gleiche Problem: Jedes erfordert dediziertes Fachwissen, um in der Produktion ordnungsgemäß betrieben werden zu können. Die Dimensionierung von Knoten, die Konfiguration des Quorums, das Testen von Failover, die Verwaltung von Versionsupgrades ohne Unterbrechung des Nachrichtenflusses stellt Engineering-Zeit dar, die keinen geschäftlichen Wert erzeugt.
Auf Hikube absorbiert der Kubernetes-Betreiber diesen Aufwand für alle drei Dienste. Sie deklarieren, was Sie wollen, Anzahl der Knoten, Topics oder Vhosts, Ressourcen, und der Betreiber stellt bereit, repliziert und schaltet im Falle eines Ausfalls um. Die Konfiguration zu ändern ist so, als würde man einen Wert in einer YAML-Datei ändern und anwenden.
Automatisches Quorum und Konsens
ZooKeeper für Kafka, Raft für RabbitMQ und JetStream NATS. Die Leader-Election-Mechanismen werden ohne manuellen Eingriff konfiguriert und überwacht.
Topics, vhosts und streams mit dem Cluster
Partitionen, Retention, Virtual Hosts, JetStreams, die in YAML am selben Ort deklariert werden. Kein separates Initialisierungsskript, das gepflegt werden muss.
Scaling ohne Unterbrechung
Ändern Sie die Anzahl der Knoten im Manifest und wenden Sie sie an. Der Operator fügt die Instanzen im Rolling Update ohne manuelles Rebalancing und ohne Downtime hinzu.
Selbst erstellte Credentials
Die Passwörter werden beim Provisioning in einem Kubernetes Secret erstellt. Verweisen Sie in Ihren Pods auf das Secret, keine Schlüssel im Klartext in Ihren Manifesten oder Git-Repositories.
Welcher Dienst für welchen Bedarf?
Die drei Dienste konkurrieren nicht miteinander, sondern ergänzen sich. Hier sind die konkreten Muster, in denen sich jeder durchsetzt.
Pipeline von Anwendungslogs
Verwaltung von Millionen von Log-Ereignissen aus 50 Mikrodiensten. 7 Tage Speicherung, mehrere unabhängige Consumer (Elasticsearch, ClickHouse, Alerting). Jeder Consumer liest aus seinem eigenen Offset nach.
Event Sourcing und Audit Trail
Jede Benutzeraktion wird in einem Thema mit cleanup.policy: compact veröffentlicht. Der aktuelle Status ist die Summe der Ereignisse. Das Topic compact stellt sicher, dass der letzte Status pro Schlüssel beibehalten wird.
Warteschlange für die Bearbeitung von E-Mails
Befehle lösen eine Nachricht in einer Warteschlange emails.pending aus. Workers lesen die Warteschlange, senden die E-Mail und ACK die Nachricht. Wenn ein Worker abstürzt, wird die Nachricht automatisch neu gequeued.
Routing von Veranstaltungen mit mehreren Zielen
Ein Exchange vom Typ topic routet die Ereignisse orders.* in die Rechnungswarteschlange, orders.shipped in die Logistikwarteschlange und # in eine Audit-Warteschlange. Ein Publish, mehrere Ziele.
Kommunikation zwischen Mikrodiensten
Dienst A ruft Dienst B über NATS request/reply statt HTTP an. Keine Service Discovery, kein Load Balancer. NATS routet direkt zu einem verfügbaren Subscriber in der Queue Group.
IoT-Telemetrie mit JetStream
10.000 Sensoren veröffentlichen Metriken auf sensors.>. JetStream speichert 24 Stunden lang Daten. Analysedienste verbinden sich und spielen beim Start die Historie ab. Nützlich nach einer Wartung.
Event-Driven als Grundlage für moderne Architekturen
Ereignisorientierte Architekturen sind zum Standard moderner verteilter Systeme geworden. Wo synchrone APIs schwache Kopplungen schaffen, ermöglichen Message Broker die Kommunikation zwischen Diensten ohne direkte Abhängigkeit. Jeder Dienst produziert oder konsumiert Ereignisse in seinem eigenen Tempo.
Kafka strukturiert Pipelines mit großen Datenmengen, Logs, Metriken, Geschäftsereignissen, mit langer Speicherung und Ereigniswiederholung, die Prüfung und Disaster Recovery vereinfacht. RabbitMQ sorgt für die zuverlässige Weiterleitung kritischer Aufgaben: Jede Nachricht wird genau einmal verarbeitet, mit Zustellungsgarantie. NATS reduziert die Reibung zwischen Microservices durch leichte Kommunikation, Mikrosekunden-Latenz und ohne schwere Infrastruktur.
In der gemanagten Version übernehmen Ihre Teams diese Patterns, ohne bei der Infrastruktur von Grund auf neu anfangen zu müssen. Die gleiche Technologie, die gleichen SDKs und die gleichen Tools werden von Hikube bereitgestellt und betrieben.
Entkopplung und Ausfallsicherheit von Anwendungen
Ein ausgefallener Dienst zieht nicht die anderen nach sich. Die Nachrichten sammeln sich im Broker an und werden bei der Wiederaufnahme verarbeitet, ohne Verluste oder manuelle Eingriffe.
IoT und Edge Computing
NATS inkorporiert Millionen von Sensorereignissen mit einem minimalen Speicherplatzbedarf. JetStream stellt sicher, dass die Daten nicht verloren gehen, wenn ein Verarbeitungsdienst neu gestartet wird.
Data-Streaming und Echtzeit-Analytik
Füttern Sie ClickHouse, Elasticsearch oder Ihre Grafana-Dashboards kontinuierlich aus Kafka. Dasselbe Topic kann gleichzeitig mehrere unabhängige Consumer füttern.
Kompatibel mit Ihrem Stack
Kafka Connect, Confluent SDKs, pika, nats.go, nats.py. Alle bestehenden Clients funktionieren ohne Änderungen. Verweisen Sie auf den Kubernetes-Dienst, der Rest ist identisch.
FAQ
Frage zu Managed Streaming & Messaging
Kafka oder RabbitMQ, wie soll man sich entscheiden?
Kafka ist für hochvolumiges Streaming und lange Retention gemacht - Nachrichten bleiben nach dem Konsum verfügbar, mehrere Consumer können das gleiche Topic unabhängig voneinander lesen. Es ist die natürliche Wahl für Datenpipelines, Event Sourcing und Echtzeitanalytik.
RabbitMQ ist für Task Queues und komplexes Routing gemacht - Nachrichten werden verbraucht und gelöscht, mit garantiertem acknowledgement. Es ist die natürliche Wahl für Hintergrundverarbeitung, asynchrone Workflows und Systeme, in denen jede Nachricht genau einmal verarbeitet werden muss.
Wann sollte man NATS anstelle von Kafka oder RabbitMQ verwenden?
NATS ist die richtige Wahl, wenn Sie eine leichte und schnelle Kommunikation zwischen Mikrodiensten benötigen - ohne die Komplexität eines schwerfälligen Brokers. Seine Sub-Millisekunden-Latenz und sein minimaler Speicherplatzbedarf (<10 MB pro Instanz) machen ihn zur besten Wahl für Edge-Architekturen, IoT und die Request/Reply-Kommunikation zwischen Diensten.
Wenn Sie Langzeitpersistenz und großflächige Ereigniswiederholungen benötigen, ist Kafka nach wie vor besser geeignet. Wenn Sie komplexes Routing mit garantiertem ACK benötigen, ist RabbitMQ besser geeignet.
Warum benötigt ZooKeeper eine ungerade Anzahl von Replikas?
Ist NATS JetStream standardmäßig aktiviert?
Ja, JetStream ist auf Hikube-NATS-Clustern standardmäßig aktiviert. Deaktivieren Sie es nur, wenn Sie einen rein flüchtigen Pub/Sub ohne Persistenz benötigen - so reduzieren Sie den Speicherplatzbedarf und beseitigen die Notwendigkeit eines persistenten Volumens. Lassen Sie in der Produktion JetStream aktiviert, um von Persistenz, Replay und dauerhaften Consumer Groups zu profitieren.
Achtung: Auch bei aktiviertem JetStream werden Nachrichten nur dann persistiert, wenn ein Stream so konfiguriert ist, dass er die betreffenden Subjects erfasst.
Was ist der Unterschied zwischen Partitionen und replicationFactor in Kafka?
Partitionen definieren Parallelität - mehr Partitionen ermöglichen es mehr Consumern, parallel zu lesen. Jede Partition ist eine geordnete Folge von Nachrichten an einen Broker.
Der replicationFactor definiert die Nachhaltigkeit - jede Partition wird auf diese Anzahl von Brokern kopiert. Wenn ein Broker fällt, werden seine Partitionen von den Replikaten bedient. Der replicationFactor kann die Anzahl der Broker nicht überschreiten.
Kann ich meinen Cluster außerhalb des Kubernetes-Clusters ausstellen?
Ja, für Kafka und RabbitMQ über external: true, und für NATS über external: true. Kafka erstellt einen LoadBalancer pro Broker, RabbitMQ legt die Ports AMQP (5672) und Management (15672) offen, NATS legt den Client-Port (4222) offen.
Durch die externe Exposition ist der Dienst über das Internet erreichbar - stellen Sie sicher, dass Sie starke Passwörter verwenden. Kafka hat keine Standardauthentifizierung auf Hikube, daher wird dringend davon abgeraten, den Dienst ohne zusätzliche Sicherheitskonfiguration auszusetzen.