Logo GH

Message Queues: RabbitMQ, Kafka

Message Queues: RabbitMQ, Kafka

1) Wann was zu wählen

RabbitMQ (AMQP 0-9-1 / 1. 0, klassische Warteschlangen, Quorum Queues, Streams)

Geeignet für: RPC/Befehle, Workflow, kurze Aufgaben, Fanout/Topic-Routing, flexible Bestätigungen, Prioritätsmanagement.
Vorteile: reichhaltige Routing-Semantik (Exchanges), 'basic. qos'(prefetch), per-message TTL/delay, komfortable RPC (reply-to) Muster, einfacher Start.
Nachteile: Geschichte wird in der Warteschlange gespeichert, horizontale Skalierung in Warteschlangen/Shards; hohe Durchlaufkosten bei sehr großen Strömen.

Apache Kafka (Ereignisprotokoll, Parteien, Verbrauchergruppen)

Geeignet für: Event-Streams, Auditing, Event-Sourcing, ETL/Integrationen (Connect), hohe RPS/MBps, Replikate/Re-Processing, Stream-Processing (Streams/ksqlDB).
Vorteile: Langzeitprotokoll, Skalierung nach Partitur, stabile Replikation, Schlüsselkomprimierung.
Nachteile: Modell „Pull + Party“ - nicht für kleine RPC; Ordnung nur innerhalb der Partei; Das Management von Schaltungen/Kompatibilität liegt in der Verantwortung des Teams.

💡 Praxis: Teams/Taski → RabbitMQ, Events/Audit/ETL → Kafka. In großen Systemen existieren beide nebeneinander.

2) Liefersemantik und Invarianten

At-most-once: keine Rückblenden; schnell, Verlustrisiko.
At-least-once: mit Retrays; erfordert die Idempotenz des Verbrauchers.
Exactly-once: erreichbar unter eingeschränkten Bedingungen (Kafka TX + idempotent producer + consistent sink; RabbitMQ - über Deduplizierungstabelle/idempotente Schlüssel).
Reihenfolge: RabbitMQ - Reihenfolge in der Warteschlange (kann bei Retrays/Multi-Consumern gestört werden); Kafka ist die Ordnung in der Partei, der Schlüssel ist die Partizipation.

Domain-Invarianten: Geld/Guthaben - durch Zeitschriften/Sagen und idempotente Befehle; Verlassen Sie sich nicht auf LWW.

3) Integrationsmuster

Outbox/InBox: atomare Aufzeichnung des Ereignisses in der DB → Veröffentlichung in der Warteschlange (Outbox) und idempotenter Verbrauch mit Protokoll der Behandlungen (Inbox).
DLQ (tote E-Mails): nach N Versuchen/Fehlern - in DLQ + alert.
Retry/Delay: RabbitMQ — TTL + dead-letter exchange; Kafka - Retry-Tops mit Backoff.
Request/Reply: RabbitMQ — `reply_to` + `correlation_id`; Kafka - selten, nur spezielle Muster.
Entschädigung: Saga über Ereignisse; Jede Operation hat eine umgekehrte.

4) Entwurf von Schlüsseln und Topologien

RabbitMQ

Exchanges: `direct`, `topic`, `fanout`, `headers`.
Routing-Schlüssel: Definiert den Treffer in der Warteschlange (n). Zur Priorisierung gibt es separate Warteschlangen.
QoS: 'prefetch' (z.B. 50-300) gleicht Geschwindigkeit/Latenz aus.
Quorum Queues: replizierbare Warteschlangen auf Floß; Ersatz für mirrored classic.
Streams: Stream mit Offsets (Kafka-like) für High-Throughput/Replay.

Kafka

Topic → partitions: Planen Sie'# partitions' nach dem Ziel throughput und Parallelität (abwärtskompatibel ist das Vergrößern einfacher als das Verkleinern).
Schlüssel: Alle Einträge eines Schlüssels sind in einer Partei (Garantie der Reihenfolge nach Schlüssel).
Replikationsfaktor: 3 für produktive Themen, 'min. insync. replicas = 2'+ 'acks = all' für Zuverlässigkeit.
Retention: nach Zeit/Größe; compaction - Speichert die letzten Werte mit dem Schlüssel + tombstones zum Löschen.

5) Retrai, DLQ, Idempotenz

RabbitMQ

Wiederholungen: per-message TTL + DLX (dead-letter exchange) mit backoff (z.B. 1m → 5m → 15m).
Idempotenz: 'correlation _ id '/' message-id' + Tabelle der verarbeiteten Nachrichten (TTL) oder deterministische Befehle.
Bestätigungen: manual 'basic. ack 'nach erfolgreicher Transaktion;' basic. nack(requeue=false)` в DLQ.

Kafka

Wiederholungen: einzelne Retry-Topics; consumer offset nach erfolgreichem side-effect.
Exactly-once processing (EOS): Producer `enable. idempotence = true', transaktionaler Erzeuger/Verbraucher, „read _ committed“ auf den Verbraucher; sink (z. B. Kafka→Kafka oder Kafka→DB durch eine Transaktion) - sorgfältig synchronisieren.
Dedup: durch Schlüssel/idempotent Schlüssel auf der Seite der Basis, oder durch compacted Thema.

6) Leistung und Dimension

Little's Law: „L = λ × W“

Für workerow: der geforderte Parallelismus ' N ≈ arrival_rate × avg_processing_time × der Vorrat (1. 2–1. 5)`.
RabbitMQ prefetch: Beginnen Sie mit 'prefetch = 100' und messen Sie p99/Zeit 'in-flying'.
Kafka-Partitionen: Berechnung aus gewünschter Consumer-Parallelität und Throughput-Ziel (z.B. 1 Partitur stabil 5-20 MB/s auf SSD/10GbE).

7) Beobachtbarkeit und Warnungen

Allgemein:
  • Lag/Backlog (messages/bytes), age messages (p95/p99), error-rate processings, DLQ-rate.
  • Zeit der publikatsiya→obrabotka (End-to-End)
  • Abhängigkeitskarte: Producer → Broker → Consumer.
RabbitMQ:
  • Verbindungen, Kanäle, nicht gescannte Nachrichten, 'memory _ alarm', 'disk _ free _ limit', 'queue length' p95.
  • Berichte über Quorum (Leader, Floß-Log, Fehler 'quorum not enough').
Kafka:
  • Under-replicated partitions, ISR shrink/expand, controller changes.
  • Producer errors (timeouts, `request latency`), consumer lag per group/partition.
  • Broker I/O, page cache hit, GC, ZooKeeper/KRaft health.

8) Sicherheit und Multi-Tenant

TLS-Verschlüsselung im Transit, Authentifizierung (SASL/PLAIN/SCRAM/OAuth, mTLS).
Autorisierung: vhost/permissions (RabbitMQ), ACL auf Tops/Gruppen (Kafka).
Kontingente: für Verbindungen, Kanäle, Warteschlangen-/Topic-Größe, Veröffentlichungs-/Lesegeschwindigkeit.
Isolierung nach Mittwoch (dev/stage/prod) und nach namespace/vhost.

9) Betrieb und Tuning

RabbitMQ

Verteilen Sie die Exchanges/Queues auf die Knoten (CPU/IO Capacity).
Lazy queues (Nachrichten auf der Festplatte) für große Puffer; Vermeiden Sie „heiße“ Warteschlangen ohne Sharding.
Quorum Queues für HA; Planen Sie die Größe des Raft-Journals und der Disc.
TTL/Length-Limit-Richtlinien, Warteschlangenpriorität nur bei tatsächlichem Bedarf (teuer).

Beispiel für eine DLQ/TTL-Richtlinie (Idee):
bash rabbitmqctl set_policy DLX "^task\." \
'{"dead-letter-exchange":"dlx","message-ttl":60000,"max-length":100000}' --apply-to queues

Kafka

SSD/NVMe, schnelle Netzwerke; OS-Tuning (Swappiness niedrig, Dateilimits).
`acks=all`, `linger. ms'(Batching), 'compression. type = zstd '/lz4 für den Durchsatz.
Verbraucherparameter: 'max. poll. interval. ms`, `max. poll. records`, `fetch. min. bytes`.
Retention und Compaction - Lager-/Replay-Balance.

Beispiel für eine zuverlässige Publikation (Java, Ideen):
java props. put("acks","all");
props. put("enable. idempotence", "true");
props. put("max. in. flight. requests. per. connection","1");
props. put("retries","10");

10) Integrationen und Ökosystem

Kafka Connect (Sinks/Sources), Schema Registry (Avro/JSON/Protobuf) und Kompatibilität („BACKWARD/FORWARD/FULL“).
Kafka Streams/ksqlDB: stateful-Operationen, Fenster, Aggregate.
RabbitMQ Shovel/Federation: Transfer zwischen Clustern/Zentren.
Betreiber K8s: Strimzi (Kafka), RabbitMQ Cluster Operator; GitOps-Manifeste.

11) Implementierung Checkliste (0-45 Tage)

0-10 Tage

Use-case's definieren: Befehle/Taski (RabbitMQ), Ereignisse/Audit (Kafka).
Wählen Sie die Schlüssel ('routing key '/' partition key'), setzen Sie die SLO „publikatsiya→obrabotka“.
Grundlegende Sicherheitsrichtlinien (TLS, ACL), Kontingente, DLQ/TTL.

11-25 Tage

Implementieren outbox/inbox, idempotency und dedup.
Rückblenden mit Backoff einrichten (Rabbit: TTL + DLX; Kafka: retry topics).
Dashboards: Verzögerung, Alter, DLQ-Rate, Ende-zu-Ende-Latenz; Alertas.

26-45 Tage

Tuning des Durchsatzes: prefetch/acks (Rabbit); partitions/acks/batch (Kafka).
DR-Verfahren (Spiegelung/Replikation), Knotenausfalltests.
Dokumentieren Sie Ereignisverträge (Diagramme) und Kompatibilitätsrichtlinien.

12) Anti-Muster

Ein „universelles“ Werkzeug für alle Aufgaben.
Keine DLQ/TTL: ewige Vergifter (poison messages).
Unbegrenzte „prefetch“ → Hunger der Verbraucher, Wachstum p99.
Kafka ohne Schlüssel → Verlust der Ordnung/heiße Parteien standardmäßig.
„Exactly-once“ ohne echtes Bedürfnis/Disziplin ist ein falsches Sicherheitsgefühl.
Geheimnisse/Logins im Code, ohne TLS/ACL.
Hardcode von Schemas/Versionen von Nachrichten ohne Registry und Migrationen.

13) Reifegradkennzahlen

Lag/age SLO wird ≥ 99% der Zeit ausgeführt; DLQ-Rate unter Kontrolle.
Idempotenz deckt 100% der kritischen Pfade ab; outbox/inbox implementiert.
Retention/Compaction sind dokumentiert, Replikate brechen Verbraucher nicht.
Alerts für ISR/URP (Kafka) und Raft/Disk Limits (Rabbit) sind konfiguriert.
Die Ereignisverträge werden versioniert (Schema Registry), die Kompatibilität in CI getestet.
Regelmäßige Spieltage: Ausfall Knoten/Broker/AZ, Überprüfung der Wiederherstellung.

14) Beispiele für Config (Zusammenfassung)

RabbitMQ: Präfetch und Bestätigungen (Pseudocode):
python channel. basic_qos(prefetch_count=200)
for msg in consume("tasks"):
try:
handle(msg)
channel. basic_ack(msg. delivery_tag)
except Transient:
channel. basic_nack(msg. delivery_tag, request = False) # will go to DLQ
Kafka Consumer (Ideen):
java props. put("enable. auto. commit","false");
props. put("isolation. level","read_committed"); // при EOS
//...
poll -> process(idempotent) -> commitSync()

15) Fazit

RabbitMQ und Kafka lösen verschiedene Klassen von Aufgaben: Teams/Tasks und Rich Routing gegen ein langfristiges Ereignisprotokoll und skalierbares Streaming. Erfolg liegt in der richtigen Liefersemantik, der Disziplin der Idempotenz, der durchdachten Keynote, den Retrays/DLQs, der Beobachtbarkeit und der strengen Sicherheit. Bauen Sie Engineering-Praktiken - Outbox/Inbox, Schemata und GitOps-Richtlinien - um die Warteschlangen auf und Ihre Integration wird vorhersehbar, skalierbar und nachhaltig.

Contact

Kontakt aufnehmen

Kontaktieren Sie uns bei Fragen oder Support.Wir helfen Ihnen jederzeit gerne!

Integration starten

Email ist erforderlich. Telegram oder WhatsApp – optional.

Ihr Name optional
Email optional
Betreff optional
Nachricht optional
Telegram optional
@
Wenn Sie Telegram angeben – antworten wir zusätzlich dort.
WhatsApp optional
Format: +Ländercode und Nummer (z. B. +49XXXXXXXXX).

Mit dem Klicken des Buttons stimmen Sie der Datenverarbeitung zu.