Kafka ist eine hervorragende verteilte Nachrichten-Middleware, die in vielen Systemen für die Nachrichtenkommunikation verwendet wird. Das Verstehen und Verwenden verteilter Messagingsysteme ist für einen Backend-Entwickler fast zu einer notwendigen Fähigkeit geworden. Heute 码哥字节
Ich beginne mit häufigen Kafka-Interviewfragen und spreche mit Ihnen über Kafka.
Distributed Messaging ist ein Kommunikationsmechanismus. Im Gegensatz zu RPC, HTTP, RMI usw. verwendet Message Middleware einen verteilten Middle Agent für die Kommunikation. Wie in der Abbildung gezeigt, sendet das vorgelagerte Geschäftssystem nach Verwendung der Nachrichten-Middleware Nachrichten, die zunächst in der Nachrichten-Middleware gespeichert werden, und dann verteilt die Nachrichten-Middleware die Nachrichten an die entsprechenden Geschäftsmodulanwendungen (verteiltes Producer-Consumer-Modell). Dieser asynchrone Ansatz reduziert den Grad der Kopplung zwischen Diensten.
Nachrichten-Middleware definieren:
Der Verweis auf zusätzliche Komponenten in der Systemarchitektur erhöht zwangsläufig die architektonische Komplexität des Systems und die Schwierigkeit von Betrieb und Wartung. Was sind also die Vorteile der Verwendung verteilter Messaging-Middleware im System? Welche Rolle spielt die Nachrichten-Middleware im System?
Bei Interviews achten Interviewer häufig auf die Fähigkeit des Interviewers, Open-Source-Komponenten auszuwählen. Dies kann nicht nur die Breite des Wissens des Interviewers, sondern auch die Tiefe seines Wissens über einen bestimmten Systemtyp testen dass der Interviewer in der Lage ist, das Gesamtsystem und den Systemarchitekturentwurf zu verstehen. Es gibt viele verteilte Open-Source-Messaging-Systeme und verschiedene Messaging-Systeme haben unterschiedliche Eigenschaften. Die Auswahl eines Messaging-Systems erfordert nicht nur ein gewisses Verständnis für jedes Messaging-System, sondern auch ein klares Verständnis Ihrer eigenen Systemanforderungen.
Das Folgende ist ein Vergleich mehrerer gängiger verteilter Nachrichtensysteme:
Allgemeine Konzepte in der Kafka-Architektur:
Layout der Kafka-Themenpartitionen
Kafka-Themenpartitionen, und die Partitionen können gleichzeitig gelesen und geschrieben werden.
Kafka Consumer Offset
„Verbraucher-Offset“: ZookeeperKonsumentengruppe
Sind Kafkas Botschaften in Ordnung?
Themenebenen sind ungeordnet und Partitionen sind geordnet
Unterstützt Kafka die Lese-/Schreibtrennung?
Nicht unterstützt, nur Leader bietet externe Lese- und Schreibdienste
Wie stellt Kafka eine hohe Datenverfügbarkeit sicher?
Kopieren, bestätigen, HW
Welche Rolle spielt der Tierpfleger bei Kafka?
Clusterverwaltung, Metadatenverwaltung
Unterstützt es Transaktionen?
Nach 0.11 werden Transaktionen unterstützt und können „genau einmal“ durchgeführt werden
Kann die Anzahl der Partitionen reduziert werden?
Nein, Daten gehen verloren
Das Befehlszeilentool von Kafka befindet sich im /bin
-Verzeichnis des Kafka-Pakets, das hauptsächlich Dienst- und Clusterverwaltungsskripts, Konfigurationsskripts, Informationsanzeigeskripts, Themenskripts, Clientskripts usw. enthält .
Wir können normalerweise kafka-console-consumer.sh
和kafka-console-producer.sh
脚本来测试 Kafka 生产和消费,kafka-consumer-groups.sh
可以查看和管理集群中的 Topic,kafka-topics.sh
wird normalerweise verwendet werden, um den Verbrauchergruppenstatus von Kafka anzuzeigen.
Die normale Produktionslogik des Kafka Producers umfasst die folgenden Schritte:
Der Prozess des Produzenten zum Versenden von Nachrichten ist in der Abbildung unten dargestellt, die stapelweise an den Broker gesendet werden muss. 拦截器
,序列化器
和分区器
,最终由累加器
Standardwert: 200, die Anzahl der Nachrichten in jedem Stapel, funktioniert nur für ASYC.
Standardwert: 0, 0 bedeutet, dass der Produzent nicht auf die Bestätigung des Leiters warten muss, 1 bedeutet, dass der Leiter das Schreiben in sein lokales Protokoll bestätigen und dies sofort bestätigen muss, -1 bedeutet, dass der Produzent dies bestätigen muss nachdem alle Sicherungen abgeschlossen sind. Es funktioniert nur im asynchronen Modus. Die Anpassung dieses Parameters ist ein Kompromiss zwischen Datenverlust und Übertragungseffizienz. Wenn Sie nicht empfindlich auf Datenverlust reagieren, aber Wert auf Effizienz legen, können Sie ihn auf 0 setzen, was die Effizienz erheblich verbessern kann der Produzent bei der Übermittlung von Daten.
request.timeout.ms
Standardwert: 10000, Bestätigungszeitlimit.
partitioner.class
Standardwert: kafka.producer.DefaultPartitioner, muss kafka.producer.Partitioner implementieren und eine Partitionierungsstrategie basierend auf dem Schlüssel bereitstellen. Manchmal müssen dieselben Nachrichtentypen nacheinander verarbeitet werden, daher müssen wir die Zuordnungsstrategie anpassen, um dieselben Datentypen derselben Partition zuzuweisen.
producer.type
Standardwert: sync, gibt an, ob die Nachricht synchron oder asynchron gesendet wird. Verwenden Sie kafka.producer.AyncProducer für asynchrones asynchrones Batch-Versenden und kafka.producer.SyncProducer für synchrone Synchronisierung. Synchrones und asynchrones Senden wirken sich auch auf die Effizienz der Nachrichtenproduktion aus.
compression.topic
Standardwert: keine, Nachrichtenkomprimierung, standardmäßig keine Komprimierung. Weitere Komprimierungsmethoden sind „gzip“, „snappy“ und „lz4“. Durch die Komprimierung von Nachrichten können das Netzwerkübertragungsvolumen und die Netzwerk-E/A erheblich reduziert und so die Gesamtleistung verbessert werden.
compressed.topics
Standardwert: null Wenn die Komprimierung festgelegt ist, können Sie eine bestimmte Themenkomprimierung angeben. Wenn nicht angegeben, wird die gesamte Komprimierung durchgeführt.
message.send.max.retries
Standardwert: 3, die maximale Anzahl der Versuche, Nachrichten zu senden.
retry.backoff.ms
Standardwert: 300, jedem Versuch wird ein zusätzliches Intervall hinzugefügt.
topic.metadata.refresh.interval.ms
Standardwert: 600000, die Zeit, um regelmäßig Metadaten abzurufen. Wenn die Partition verloren geht und der Leader nicht verfügbar ist, ruft der Produzent auch aktiv Metadaten ab. Wenn er 0 ist, werden Metadaten bei jedem Senden der Nachricht abgerufen, was nicht empfohlen wird. Wenn negativ, werden Metadaten nur bei einem Fehler abgerufen.
queue.buffering.max.ms
Standardwert: 5000, die maximale Zeit zum Zwischenspeichern von Daten in der Producer-Warteschlange, nur für ASYC.
queue.buffering.max.message
Standardwert: 10000, die maximale Anzahl der vom Produzenten zwischengespeicherten Nachrichten, nur für ASYC.
queue.enqueue.timeout.ms
Standardwert: -1, 0 wird verworfen, wenn die Warteschlange voll ist, der negative Wert ist der Block, wenn die Warteschlange voll ist, der positive Wert ist die entsprechende Zeit des Blocks, wenn die Warteschlange voll ist, nur für ASYC.
Jeder Verbraucher kann nur Nachrichten aus der zugewiesenen Partition konsumieren, und jede Partition kann nur von einem Verbraucher in einer Verbrauchergruppe konsumiert werden. Wenn also die Anzahl der Verbraucher in derselben Verbrauchergruppe die Anzahl der Partitionen überschreitet, werden einigen Verbrauchern Partitionen zugewiesen, die nicht verbraucht werden können. Die Beziehung zwischen Verbrauchergruppen und Verbrauchern ist in der folgenden Abbildung dargestellt:
Der Konsum von Nachrichten durch den Kafka Consumer Client umfasst normalerweise die folgenden Schritte:
Weil Kafkas Consumer-Client threadsicher ist Thread zu gewährleisten Sicherheit und Verbesserung der Verbrauchsleistung. Auf der Verbraucherseite kann ein Thread-Modell ähnlich dem Reactor verwendet werden, um Daten zu verbrauchen.
host:port
Format. host:port
格式。key.serializer
对应,key 的反序列化方式。value.serializer
对应,value 的反序列化方式。false
,则需要在程序中手动提交位移。对于精确到一次的语义,最好手动提交位移max.poll.records
key.serializer
entspricht der Deserialisierungsmethode von key. 🎜🎜🎜🎜value.deserializer: value.serializer
entspricht der Deserialisierungsmethode von value. 🎜🎜🎜🎜session.timeout.ms: Der Zeitpunkt, zu dem die Koordinatorerkennung fehlgeschlagen ist. Der Standardwert ist 10 Sekunden. Dieser Parameter ist das Zeitintervall, in dem die Verbrauchergruppe einen Absturz (Comsummer, ein Mitglied der Gruppe) aktiv erkennt, ähnlich der Heartbeat-Ablaufzeit. 🎜🎜🎜🎜auto.offset.reset: Dieses Attribut gibt an, dass der Verbraucher eine Partition ohne Offset liest und der Offset ungültig ist (der aktuelle Offset des Verbrauchers ist seit langer Zeit abgelaufen und wurde abgelaufen und gelöscht). Was ist in diesem Fall zu tun? Der Standardwert ist „Latest“, was bedeutet, dass Daten aus dem neuesten Datensatz gelesen werden (der Datensatz, der nach dem Start des Verbrauchers generiert wird). Beginnen Sie mit dem Lesen der Daten von der Startposition aus. 🎜🎜🎜🎜enable.auto.commit: Keine automatische Festschreibung der Verschiebung, wenn false
, Sie müssen die Verschiebung manuell im Programm eingeben. Für eine genau einmalige Semantik ist es besser, die Verschiebung manuell zu übermitteln. 🎜🎜🎜🎜fetch.max.bytes: Die maximale Anzahl von Datenbytes, die in einem einzigen Mal abgerufen werden. 🎜🎜🎜🎜max.poll.records: Die maximale zurückgegebene Nachricht durch einen einzelnen Poll-Aufruf. Wenn die Verarbeitungslogik sehr leichtgewichtig ist, können Sie diesen Wert entsprechend erhöhen. AberKafka RebalanceRebalance ist im Wesentlichen ein Protokoll, das festlegt, wie alle Verbraucher einer Verbrauchergruppe eine Vereinbarung zur Zuweisung jeder Partition des Abonnementthemas treffen können. Beispielsweise gibt es in einer bestimmten Gruppe 20 Verbraucher und sie abonniert ein Thema mit 100 Partitionen. Unter normalen Umständen weist Kafka jedem Verbraucher durchschnittlich 5 Partitionen zu. Dieser Zuordnungsprozess wird als Rebalancing bezeichnet.
Wann wieder ins Gleichgewicht kommen?
Auch diese Frage wird oft gestellt. Es gibt drei Auslösebedingungen für die Neuausrichtung:
Gruppenmitglieder ändern sich (neuer Verbraucher tritt der Gruppe bei, bestehender Verbraucher verlässt die Gruppe freiwillig oder bestehender Verbraucher stürzt ab – der Unterschied zwischen beiden wird später besprochen)
Abonnieren das Thema Die Anzahl der Partitionen hat sich geändert
Die Anzahl der Partitionen, die das Thema abonniert haben, hat sich geändert
Wie ordne ich Partitionen innerhalb der Gruppe zu?
Kafka bietet standardmäßig zwei Zuordnungsstrategien: Range und Round-Robin. Natürlich verwendet Kafka eine steckbare Allokationsstrategie, und Sie können Ihren eigenen Allokator erstellen, um verschiedene Allokationsstrategien zu implementieren.
Antwortschlüsselwörter
Was sind die Befehlszeilentools für Kafka? Welche haben Sie verwendet? /bin
Verzeichnis, Kafka-Cluster verwalten, Thema verwalten, Kafka produzieren und konsumieren
Der Ausführungsprozess von Kafka Producer? Abfangjäger, Serialisierer, Partitionierer und Akkumulatoren
Was sind die häufigsten Konfigurationen von Kafka Producer? Broker-Konfiguration, Bestätigungskonfiguration, Netzwerk- und Sendeparameter, Komprimierungsparameter, Bestätigungsparameter
Wie halte ich Kafka-Nachrichten in Ordnung? Kafka selbst ist auf Themenebene ungeordnet und wird nur auf der Partition geordnet. Um die Verarbeitungsreihenfolge sicherzustellen, können Sie den Partitionierer anpassen und die Daten, die sequentiell verarbeitet werden müssen, an dieselbe Partition senden Stellen Sie sicher, dass die Daten reibungslos gesendet werden. Bestätigungsmechanismus, Wiederholungsmechanismus
Wie kann die Leistung des Produzenten verbessert werden? Batch, asynchron, Komprimierung
Wenn die Anzahl der Verbraucher in derselben Gruppe größer ist als die Anzahl der Teile, wie geht Kafka damit um? Der redundante Teil befindet sich in einem nutzlosen Zustand und verbraucht keine Daten.
Ist Kafka Consumer Thread-sicher? Unsicherer Single-Thread-Verbrauch, Multi-Thread-Verarbeitung
Erzählen Sie mir etwas über das Thread-Modell, wenn Sie Kafka Consumer zum Konsumieren von Nachrichten verwenden. Trennung von Ziehen und Verarbeiten
Gemeinsame Konfigurationen von Kafka Consumer? Broker, Netzwerk- und Pull-Parameter, Heartbeat-Parameter
Wann wird der Verbraucher aus dem Cluster geworfen? Absturz, Netzwerkanomalie, lange Verarbeitungszeit, Zeitüberschreitung bei der Übermittlungsverschiebung
Wie reagiert Kafka, wenn ein Verbraucher beitritt oder austritt? Rebalance durchführen
Was ist Rebalance und wann findet Rebalance statt? Themenwechsel, Verbraucherwechsel
Hohe Verfügbarkeit und Leistung
Fragen
Wie stellt Kafka eine hohe Verfügbarkeit sicher?
Kafkas Liefersemantik?
Was macht Replic?
Was ist los, AR, ISR?
Was sind Leader und Flower?
Wofür stehen HW, LEO, LSO, LW usw. bei Kafka?
Welche Verarbeitung hat Kafka vorgenommen, um eine überlegene Leistung sicherzustellen?
Partition und Replikat
In verteilten Datensystemen werden Partitionen normalerweise verwendet, um die Verarbeitungskapazität des Systems zu verbessern und eine hohe Datenverfügbarkeit durch Replikate sicherzustellen. Unter Mehrfachpartitionierung versteht man die Möglichkeit, mehrere Kopien gleichzeitig zu verarbeiten. Dabei ist nur eine die führende Kopie und die anderen sind Folgekopien. Nur die Führungskopie kann Dienste für die Außenwelt bereitstellen. Mehrere Follower-Kopien werden in der Regel in verschiedenen Brokern von der Leader-Kopie gespeichert. Durch diesen Mechanismus wird eine hohe Verfügbarkeit erreicht. Wenn eine Maschine ausfällt, können andere Follower-Kopien schnell wieder in den Normalzustand übergehen und mit der Bereitstellung von Diensten für die Außenwelt beginnen.
Warum bietet die Follower-Kopie keinen Lesedienst?
Dieses Problem ist im Wesentlichen ein Kompromiss zwischen Leistung und Konsistenz. Stellen Sie sich vor, was würde passieren, wenn die Follower-Kopie auch Dienste für die Außenwelt leisten würde? Erstens wird die Leistung definitiv verbessert. Gleichzeitig wird es jedoch zu einer Reihe von Problemen kommen. Ähnlich wie Phantom-Lesen und Dirty-Reading bei Datenbanktransaktionen. Wenn Sie beispielsweise Daten in das Kafka-Thema a schreiben, konsumiert Verbraucher b Daten aus Thema a, stellt jedoch fest, dass er diese nicht konsumieren kann, da die neueste Nachricht nicht in die Partitionskopie geschrieben wurde, die Verbraucher b liest. Zu diesem Zeitpunkt kann ein anderer Verbraucher c die neuesten Daten verbrauchen, da er die führende Kopie verbraucht. Kafka nutzt die Verwaltung von WH und Offset, um zu entscheiden, welche Daten der Verbraucher konsumieren kann und welche Daten aktuell geschrieben werden.
Nur der Leader kann externe Lesedienste bereitstellen, also wie man den Leader wählt
kafka fügt die Replikate, die mit der Leader-Replik synchronisiert sind, in den ISR-Replikatsatz ein. Natürlich ist die Vorspannkopie immer im ISR-Kopiensatz vorhanden. In einigen Sonderfällen gibt es sogar nur eine Kopie des Vorspanns in der ISR-Kopie. Wenn der Anführer versagt, erkennt Kakfa diese Situation über Zookeeper, wählt eine neue Kopie in der ISR-Kopie aus, um zum Anführer zu werden, und stellt Dienste für die Außenwelt bereit. Dabei gibt es jedoch noch ein weiteres Problem: Es ist möglich, dass nur der Anführer im ISR-Replika-Satz vorhanden ist. Wenn der Anführer-Replika-Satz stirbt, ist der ISR-Satz zu diesem Zeitpunkt leer. Wenn zu diesem Zeitpunkt der Parameter unclean.leader.election.enable auf true gesetzt ist, wählt Kafka ein Replikat aus, das zum führenden asynchronen Replikat wird, d. h. ein Replikat, das nicht im ISR-Replikatsatz enthalten ist.
Das Vorhandensein einer Kopie führt zu Problemen bei der Synchronisierung der Kopien
Kafka verwaltet eine verfügbare Replikatliste (ISR) in allen zugewiesenen Replikaten (AR). Wenn der Produzent eine Nachricht an den Broker sendet, verwaltet er die Datensynchronisierung zwischen der Blume und dem Leader basierend auf dem ack
配置来确定需要等待几个副本已经同步了消息才相应成功,Broker 内部会ReplicaManager
-Dienst.
Leistungsoptimierung
Parallelität der Partitionen
Sequentielles Lesen und Schreiben auf die Festplatte
-
Seitencache: Lesen und Schreiben nach Seite
- Vorab lesen: Kafka wird konsumierte Nachrichten werden im Voraus in den Speicher eingelesen
Batch: Batch-Lesen und Schreiben
Komprimierung: Nachrichtenkomprimierung, Speicherkomprimierung, Reduzierung des Netzwerk- und E/A-Overheads
Parallelität der Partitionen Einerseits, da sich verschiedene Partitionen auf verschiedenen Maschinen befinden können Sie können die Vorteile des Clusters voll ausnutzen und eine parallele Verarbeitung zwischen Maschinen erreichen. Da die Partition andererseits physisch einem Ordner entspricht, können verschiedene Partitionen auf demselben Knoten so konfiguriert werden, dass sie auf verschiedenen Festplatten platziert werden, um eine parallele Verarbeitung zwischen Festplatten zu erreichen von mehreren Festplatten. Sequentielles Lesen und Schreiben Kafka-Dateien in jedem Partitionsverzeichnis werden gleichmäßig in Datendateien gleicher Größe aufgeteilt (die Standarddateigröße beträgt 500 MB, die manuell eingestellt werden kann).
Jede Datendatei wird als Segmentdatei bezeichnet, und jedes Segment verwendet Append, um Daten anzuhängen. -
Antwortschlüsselwort
Wie stellt Kafka eine hohe Verfügbarkeit sicher?
Verwenden Sie Replikate, um eine hohe Datenverfügbarkeit, Herstellerbestätigung, Wiederholungsversuche, automatische Leader-Wahl und Verbraucher-Selbstausgleich sicherzustellen.
Kafkas Liefersemantik?
Liefersemantik hat im Allgemeinen at least once
、at most once
和exactly once
. Kafka implementiert die ersten beiden durch die Bestätigungskonfiguration.
Was macht Replic?
Hohe Datenverfügbarkeit erreichen
Was sind AR und ISR?
AR: Zugewiesene Replikate. AR ist der Satz von Replikaten, die beim Erstellen der Partition nach der Erstellung des Themas zugewiesen werden. Die Anzahl der Replikate wird durch den Replikatfaktor bestimmt. ISR: In-Sync-Replikate. Ein besonders wichtiges Konzept bei Kafka bezieht sich auf die Menge der Replikate in AR, die mit dem Leader synchronisiert werden. Das Replikat im AR befindet sich möglicherweise nicht im ISR, aber das Leader-Replikat ist natürlich im ISR enthalten. In Bezug auf ISR ist eine weitere häufige Frage in Vorstellungsgesprächen, wie man feststellen kann, ob eine Kopie zu einem ISR gehören sollte. Die aktuelle Beurteilungsgrundlage ist: ob die Zeit, in der der LEO des Follower-Replikats hinter dem LEO des Leaders zurückbleibt, den Wert des Broker-seitigen Parameters replik.lag.time.max.ms überschreitet. Bei Überschreitung wird das Replikat aus dem ISR entfernt.
Was sind Leader und Flower?
Wofür steht HW bei Kafka?
Hohe Wassermarke. Dies ist ein wichtiges Feld, das den Umfang der Nachricht steuert, die der Verbraucher lesen kann. Ein normaler Verbraucher kann nur alle Nachrichten auf dem Leader-Replikat zwischen Log Start Offset und HW (exklusiv) „sehen“. Meldungen oberhalb des Wasserspiegels sind für Verbraucher unsichtbar.
Welche Verarbeitung hat Kafka vorgenommen, um eine überlegene Leistung sicherzustellen?
Partitionsparallelität, sequentielles Lesen und Schreiben auf die Festplatte, Seitencache-Komprimierung, Hochleistungsserialisierung (binär), sperrenfreie Offsetverwaltung für Speicherzuordnung, Java NIO-Modell
Dieser Artikel geht nicht auf die Implementierung ein Details und Quellcode-Analyse von Kafka, aber Kafka ist in der Tat ein ausgezeichnetes Open-Source-System. Es ist dringend zu empfehlen, dass interessierte Studenten ein tieferes Verständnis für dieses Open-Source-System haben Architekturdesignfunktionen, Codierungsfunktionen und Leistungsoptimierung werden eine große Hilfe sein.
Das obige ist der detaillierte Inhalt vonKafka aus Interviewperspektive abgeschlossen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!