Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Bewährte Methoden für Apache Kafka-Clients
Bei der Arbeit mit Apache Kafka und Amazon MSK ist es wichtig, sowohl den Client als auch den Server korrekt zu konfigurieren, um eine optimale Leistung und Zuverlässigkeit zu gewährleisten. Dieses Handbuch enthält Empfehlungen für die clientseitige Konfiguration von Amazon MSK nach bewährten Methoden.
Informationen zu den bewährten Methoden von Amazon MSK Replicator finden Sie unter. Best Practices Bewährte Methoden für Standard- und Express-Broker finden Sie unter. Bewährte Methoden für Standard- und Express-Broker
Themen
Verfügbarkeit des Apache Kafka-Clients
In einem verteilten System wie Apache Kafka ist die Sicherstellung einer hohen Verfügbarkeit entscheidend für die Aufrechterhaltung einer zuverlässigen und fehlertoleranten Messaging-Infrastruktur. Makler gehen sowohl bei geplanten als auch bei ungeplanten Ereignissen wie Upgrades, Patches, Hardwareausfällen und Netzwerkproblemen offline. Ein Kafka-Cluster ist tolerant gegenüber einem Offline-Broker, daher müssen Kafka-Clients auch das Broker-Failover ordnungsgemäß handhaben. Um eine hohe Verfügbarkeit der Kafka-Kunden sicherzustellen, empfehlen wir diese Best Practices.
Verfügbarkeit der Hersteller
Legt fest
retries, dass der Producer angewiesen wird, während eines Broker-Failovers erneut zu versuchen, fehlgeschlagene Nachrichten zu senden. Für die meisten Anwendungsfälle empfehlen wir einen Wert von Integer Max oder einen ähnlich hohen Wert. Andernfalls wird die hohe Verfügbarkeit von Kafka beeinträchtigt.Legt fest
delivery.timeout.ms, dass die Obergrenze für die Gesamtzeit zwischen dem Senden einer Nachricht und dem Empfang einer Bestätigung vom Broker angegeben wird. Dies sollte die geschäftlichen Anforderungen an die Gültigkeitsdauer einer Nachricht widerspiegeln. Stellen Sie das Zeitlimit so hoch ein, dass genügend Wiederholungsversuche möglich sind, um den Failover-Vorgang abzuschließen. Wir empfehlen für die meisten Anwendungsfälle einen Wert von 60 Sekunden oder höher.Stellen Sie
request.timeout.msdas Maximum ein, das eine einzelne Anfrage warten soll, bevor ein erneutes Senden versucht wird. Für die meisten Anwendungsfälle empfehlen wir einen Wert von 10 Sekunden oder höher.Stellen Sie diese Option ein
retry.backoff.ms, um die Verzögerung zwischen Wiederholungsversuchen zu konfigurieren, um Stürme und Beeinträchtigungen der Verfügbarkeit zu vermeiden. Für die meisten Anwendungsfälle empfehlen wir einen Mindestwert von 200 ms.Stellen Sie diese Option ein
acks=all, um eine hohe Haltbarkeit zu konfigurieren. Dies sollte der serverseitigen Konfiguration von entsprechenRF=3und sicherstellenmin.isr=2, dass alle Partitionen in ISR den Schreibvorgang bestätigen. Wenn ein einzelner Broker offline ist, ist das dermin.isr, das heißt.2
Verfügbarkeit für Verbraucher
Für neue oder neu erstellte Verbrauchergruppen auf
latestanfänglich gesetzt.auto.offset.resetDadurch wird das Risiko einer zusätzlichen Clusterlast vermieden, da das gesamte Thema behandelt wird.auto.commit.interval.msWird bei der Verwendung festgelegtenable.auto.commit. Wir empfehlen für die meisten Anwendungsfälle einen Mindestwert von 5 Sekunden, um das Risiko einer zusätzlichen Belastung zu vermeiden.Implementieren Sie die Ausnahmebehandlung in den Nachrichtenverarbeitungscode des Verbrauchers, um vorübergehende Fehler zu behandeln, z. B. einen Leistungsschalter oder einen Ruhezustand mit exponentiellem Back-Off. Andernfalls kann es zu Anwendungsabstürzen kommen, was zu einer übermäßigen Neuverteilung führen kann.
Legen
isolation.levelSie fest, wie Transaktionsnachrichten gelesen werden sollen:Wir empfehlen, standardmäßig immer
read_uncommittedimplizit einzustellen. Dies fehlt in einigen Client-Implementierungen.Wir empfehlen einen Wert von,
read_uncommittedwenn Sie mehrstufigen Speicher verwenden.Legen Sie fest
client.rack, dass das nächste Replikat gelesen wird. Wir empfehlen, die Einstellung auf den einzustellen,az idum die Kosten für den Netzwerkverkehr und die Latenz zu minimieren. Weitere Informationen finden Sie unter Reduzieren Sie die Kosten für den Netzwerkverkehr Ihrer Amazon MSK-Kunden mithilfe von Rack-Awareness.
Ungleichgewichte bei den Verbrauchern
Auf
session.timeout.mseinen Wert setzen, der größer ist als die Startzeit einer Anwendung, einschließlich eventuell auftretender Startjitter. Wir empfehlen für die meisten Anwendungsfälle einen Wert von 60 Sekunden.Hier wird genau festgelegt
heartbeat.interval.ms, wie der Gruppenkoordinator einen Verbraucher als gesund einstuft. Wir empfehlen für die meisten Anwendungsfälle einen Wert von 10 Sekunden.Setzen Sie einen Shutdown-Hook in Ihrer Anwendung, um den Consumer auf SIGTERM sauber zu schließen, anstatt sich auf Sitzungs-Timeouts zu verlassen, um festzustellen, wann ein Verbraucher eine Gruppe verlässt. Kstream-Anwendungen können auf einen Wert von gesetzt
internal.leave.group.on.closewerden.trueAuf
group.instance.ideinen bestimmten Wert innerhalb der Verbrauchergruppe gesetzt. Idealerweise ein Hostname, eine Task-ID oder eine Pod-ID. Wir empfehlen, diese Einstellung immer einzustellen, um ein deterministischeres Verhalten und eine bessere client/server Log-Korrelation bei der Problembehandlung zu gewährleisten.Stellen
group.initial.rebalance.delay.msSie einen Wert ein, der einer durchschnittlichen Bereitstellungszeit entspricht. Dadurch werden kontinuierliche Neugewichte während der Bereitstellung verhindert.Stellen Sie die Verwendung
partition.assignment.strategyvon Sticky Assignors ein. Wir empfehlen entwederStickyAssignoroderCooperativeStickyAssignor.
Leistung des Apache Kafka-Clients
Um eine hohe Leistung der Kafka-Kunden sicherzustellen, empfehlen wir diese Best Practices.
Leistung des Produzenten
Legt fest
linger.ms, wie lange ein Hersteller auf die Befüllung einer Charge wartet. Kleinere Chargen sind für Kafka rechenintensiv, da sie zu mehr Threads und Vorgängen gleichzeitig führen. I/O Wir empfehlen die folgenden Werte.Ein Mindestwert von 5 ms für alle Anwendungsfälle, einschließlich niedriger Latenz.
Für die meisten Anwendungsfälle empfehlen wir einen höheren Wert von 25 ms.
Wir empfehlen, in Anwendungsfällen mit niedriger Latenz niemals den Wert Null zu verwenden. (Ein Wert von Null verursacht in der Regel Latenz, unabhängig vom I/O-Overhead).
Wird
batch.sizezur Steuerung der Batchgröße festgelegt, die an den Cluster gesendet wird. Wir empfehlen, diesen Wert auf einen Wert von 64 KB oder 128 KB zu erhöhen.buffer.memoryWird gesetzt, wenn größere Chargengrößen verwendet werden. Für die meisten Anwendungsfälle empfehlen wir einen Wert von 64 MB.Legt fest
send.buffer.bytes, dass der TCP-Puffer gesteuert wird, der zum Empfangen von Bytes verwendet wird. Wir empfehlen den Wert -1, damit das Betriebssystem diesen Puffer verwalten kann, wenn ein Producer in einem Netzwerk mit hoher Latenz läuft.Stellen Sie compression.type ein, um die Komprimierung von Batches zu steuern. Wir empfehlen entweder lz4 oder zstd, einen Producer in einem Netzwerk mit hoher Latenz auszuführen.
Leistung für Verbraucher
Legt fest
fetch.min.bytes, ob die Mindestabrufgröße gültig ist, um die Anzahl der Abrufe und die Clusterlast zu reduzieren.Wir empfehlen für alle Anwendungsfälle einen Mindestwert von 32 Byte.
Für die meisten Anwendungsfälle empfehlen wir einen höheren Wert von 128 Byte.
Stellen Sie fetch.max.wait.ms ein, um festzulegen, wie lange Ihr Verbraucher wartet, bis fetch.min.bytes ignoriert wird. Wir empfehlen für die meisten Anwendungsfälle einen Wert von 1000 ms.
Wir empfehlen, dass die Anzahl der Verbraucher mindestens der Anzahl der Partitionen entspricht, um eine bessere Parallelität und Stabilität zu gewährleisten. Bei Themen mit geringem Durchsatz entscheiden Sie sich möglicherweise dafür, weniger Verbraucher als die Anzahl der Partitionen zu verwenden.
Legt fest
receive.buffer.bytes, dass der TCP-Puffer gesteuert wird, der zum Empfangen von Bytes verwendet wird. Wir empfehlen den Wert -1, damit das Betriebssystem diesen Puffer verwalten kann, wenn ein Consumer in einem Netzwerk mit hoher Latenz läuft.
Client-Verbindungen
Der Lebenszyklus von Verbindungen verursacht auf einem Kafka-Cluster Rechen- und Speicherkosten. Zu viele Verbindungen, die gleichzeitig hergestellt werden, verursachen eine Belastung, die sich auf die Verfügbarkeit eines Kafka-Clusters auswirken kann. Diese Beeinträchtigung der Verfügbarkeit kann oft dazu führen, dass Anwendungen noch mehr Verbindungen herstellen, was zu einem kaskadierenden Ausfall führt, der zu einem vollständigen Ausfall führt. Eine hohe Anzahl von Verbindungen kann erreicht werden, wenn sie mit einer angemessenen Geschwindigkeit hergestellt werden.
Wir empfehlen die folgenden Abhilfemaßnahmen, um hohe Verbindungsaufbauraten zu bewältigen:
Stellen Sie sicher, dass Ihr Mechanismus zur Anwendungsbereitstellung nicht producers/consumers auf einmal neu gestartet wird, sondern vorzugsweise in kleineren Batches.
Auf der Anwendungsebene sollte der Entwickler sicherstellen, dass ein zufälliger Jitter (zufälliger Ruhezustand) ausgelöst wird, bevor er einen Admin-Client, Producer-Client oder Consumer-Client erstellt.
Bei SIGTERM sollte beim Schließen der Verbindung ein zufälliger Schlafmodus ausgeführt werden, um sicherzustellen, dass nicht alle Kafka-Clients gleichzeitig geschlossen werden. Der zufällige Schlaf sollte innerhalb des Timeouts liegen, bevor SIGKILL eintritt.
Beispiel Beispiel A (Java)
sleepInSeconds(randomNumberBetweenOneAndX); this.kafkaProducer = new KafkaProducer<>(this.props);Beispiel Beispiel B (Java)
Runtime.getRuntime().addShutdownHook(new Thread(() -> { sleepInSeconds(randomNumberBetweenOneAndTwentyFive); kafkaProducer.close(Duration.ofSeconds(5)); });Auf der Anwendungsebene sollte der Entwickler sicherstellen, dass Clients pro Anwendung nur einmal in einem Singleton-Muster erstellt werden. Wenn Sie beispielsweise Lambda verwenden, sollte der Client im globalen Bereich und nicht im Methodenhandler erstellt werden.
Wir empfehlen, die Anzahl der Verbindungen zu überwachen, damit sie stabil bleibt. Die creation/close Verbindung/Schicht ist bei Bereitstellungen und Broker-Failover normal.
Überwachung von Kafka-Clients
Die Überwachung von Kafka-Kunden ist entscheidend für die Aufrechterhaltung der Gesundheit und Effizienz Ihres Kafka-Ökosystems. Ganz gleich, ob Sie ein Kafka-Administrator, Entwickler oder Mitglied des Betriebsteams sind, die Aktivierung kundenseitiger Kennzahlen ist entscheidend, um die Auswirkungen auf das Geschäft bei geplanten und ungeplanten Ereignissen zu verstehen.
Wir empfehlen, die folgenden clientseitigen Kennzahlen mithilfe Ihres bevorzugten Mechanismus zur Erfassung von Kennzahlen zu überwachen.
Berücksichtigen Sie bei der Erstellung von Support-Tickets alle ungewöhnlichen Werte AWS, die während des Vorfalls beobachtet wurden. Fügen Sie auch eine Auswahl der Client-Anwendungsprotokolle bei, in denen Fehler (keine Warnungen) detailliert beschrieben werden.
Kennzahlen für Hersteller
Byte-Rate
Senderate von Rekorden
Durchschnittswert der Datensätze pro Anfrage
Acks-Latenz-Avg
Latenz-Durchschnitt anfragen
Anforderungs-Latenz-Max
Rekordfehlerrate
Wiederholungsrate bei Rekordversuchen
Fehlerrate
Anmerkung
Vorübergehende Fehler bei Wiederholungsversuchen sind kein Grund zur Sorge, da dies Teil des Kafka-Protokolls zur Behandlung vorübergehender Probleme wie Leader-Failover oder Netzwerkneuübertragungen ist. record-send-ratewird bestätigen, ob die Hersteller immer noch Wiederholungsversuche durchführen.
Kennzahlen für Verbraucher
Rate der verbrauchten Datensätze
Rate der verbrauchten Byte
Abrufrate
Rekord-Lag-Max
Rekordfehlerrate
Fehlerrate beim Abrufen
Umfragerate
Durchschnitt der Rebalance-Latenz
festschreiben
Anmerkung
Hohe Abruf- und Commit-Raten führen zu einer unnötigen Belastung des Clusters. Es ist optimal, Anfragen in größeren Batches auszuführen.
Allgemeine Metriken
Rate beim Schließen einer Verbindung
Geschwindigkeit beim Herstellen einer Verbindung
Anzahl der Verbindungen
Anmerkung
Eine hohe Verbindung creation/termination führt zu einer unnötigen Belastung des Clusters.