Mit diesen Konfigurationseinstellungen sorgst du dafür, dass deine Producer Daten zuverlässig und performant senden.
-
acks=all: (Standard seit ~Kafka 3.4) Stellt sicher, dass der Producer wartet, bis die Nachricht in alle In-Sync-Replicas geschrieben wurde.
-
enable.idempotence=true: (Standard seit ~Kafka 3.4) Stellt sicher, dass Nachrichten genau einmal gesendet werden. Überlebt sogar Broker-Neustarts.
enable.idempotence=true garantiert dir, dass die vom Producer gesendeten Nachrichten genau einmal und in der richtigen Reihenfolge übermittelt werden. Es garantiert jedoch nicht, dass ein Consumer die Nachricht genau einmal verarbeitet. Dafür musst du Transaktionen verwenden.
Wenn du nach dem Timeout einfach in deinem eigenen Code einen erneuten Versuch startest, wäre es besser, wenn du einfach die delivery.timeout.ms erhöhst. Lies mehr über Zuverlässigkeit in diesem Artikel über zuverlässige Producer.
Durchsatz-Optimierung
Für die meisten „Medium Data“-Anwendungen kannst du einen erheblichen Performance-Schub erzielen, indem du deine Nachrichten batchst und komprimierst, ohne (zu viel) Latenz zu opfern.
-
batch.size= z.B. 900000: (Standard: 16KiB) Dieser Wert ist für die meisten Anwendungsfälle zu klein. Erhöhe ihn auf bis zu 1 MB. Dies ermöglicht es deinem Producer, mehr Daten in einer einzigen Netzwerkanfrage zu senden, was den Overhead reduziert und den Durchsatz verbessert.
-
linger.ms=5, 10 oder 100: (Standard: 0ms) Diese Einstellung arbeitet Hand in Hand mit batch.size. Sie weist den Producer an, bis zu einer bestimmten Zeit (Standard: 0 ms) zu warten, bis sich ein Batch gefüllt hat, bevor er es sendet. Eine Erhöhung auf wenige Millisekunden kann den Durchsatz erheblich verbessern, ohne die Latenz stark zu beeinträchtigen.
-
compression.type=lz4 oder zstd: (Standard: none) Das Komprimieren deiner Nachrichten, bevor sie an Kafka gesendet werden, kann die Netzwerkbandbreite sparen und den Durchsatz verbessern. Mit Algorithmen wie LZ4 oder Zstd kannst du hervorragende Ergebnisse erzielen.
Weitere Einstellungen
-
transactional.id={hostname}: Diese Einstellung wird nur benötigt, wenn du Producer-Transaktionen verwendest. Die transactional.id muss für jede Producer-Instanz eindeutig, aber über Neustarts hinweg persistent sein. Wenn eine Producer-Instanz neu startet, verwendet Kafka diese ID, um zu verhindern, dass „Zombie“-Producer Transaktionen committen. Nutze in Kubernetes StatefulSets für transaktionale Producer.
In Kubernetes solltest du StatefulSets für deine transaktionalen Producer verwenden.
-
partitioner=murmur2_random: (Standard: Murmur2Partitioner in Java, consistent_random in librdkafka) Der Partitioner bestimmt, an welche Partition eine Nachricht gesendet wird. Wenn du sowohl Java- als auch Nicht-Java-Producer verwendest, stelle bitte sicher, dass alle Producer den Partitioner auf murmur2_random setzen, um eine konsistente Partitionierung zu gewährleisten.
Wenn du sowohl Java- als auch Nicht-Java-Producer verwendest, stelle bitte sicher, dass alle Nicht-Java-Producer den Partitioner auf murmur2_random setzen, um eine konsistente Partitionierung zu gewährleisten.