Unterschied zwischen session.timeout.ms und max.poll.interval.ms für Kafka> = 0.10.1

78

Ich bin nicht klar , warum wir beide brauchen session.timeout.msund max.poll.interval.msund wann würden wir verwenden eine oder das andere oder beides? Anscheinend geben beide Einstellungen die Obergrenze für die Zeit an, die der Koordinator wartet, um den Herzschlag eines Verbrauchers zu erhalten, bevor er davon ausgeht, dass er tot ist.

Wie verhält es sich auch für Versionen 0.10.1.0+, die auf KIP-62 basieren ?

Tiefen
quelle
1
Gilt das nur für Kafka Connect?
Jacek Laskowski

Antworten:

177

Vor KIP-62 gibt es nur session.timeout.ms(dh Kafka 0.10.0und früher). max.poll.interval.mswird über KIP-62 (Teil von Kafka 0.10.1) eingeführt.

KIP-62 entkoppelt Herzschläge von Anrufen poll()über einen Hintergrund-Heartbeat-Thread und ermöglicht so eine längere Verarbeitungszeit (dh eine Zeit zwischen zwei aufeinander folgenden poll()) als das Heartbeat-Intervall.

Angenommen, die Verarbeitung einer Nachricht dauert 1 Minute. Wenn Herzschlag und Abfrage gekoppelt sind (dh vor KIP-62), müssen Sie einstellensession.timeout.ms mehr als 1 Minute , um zu verhindern, dass der Verbraucher eine Zeitüberschreitung erleidet. Wenn der Verbraucher stirbt, dauert es auch länger als 1 Minute, um den ausgefallenen Verbraucher zu erkennen.

KIP-62 entkoppelt Polling und Heartbeat und ermöglicht das Senden von Heartbeat zwischen zwei aufeinander folgenden Polls. Jetzt werden zwei Threads ausgeführt, der Heartbeat-Thread und der Verarbeitungsthread. Daher hat KIP-62 jeweils einen Timeout eingeführt. session.timeout.msist für den Heartbeat-Thread, während max.poll.interval.mses für den Verarbeitungsthread ist.

Angenommen, Sie legen fest session.timeout.ms=30000, dass der Consumer-Heartbeat-Thread vor Ablauf dieser Zeit einen Heartbeat an den Broker senden muss. Wenn andererseits die Verarbeitung einer einzelnen Nachricht 1 Minute dauert, können Sie mehr max.poll.interval.msals eine Minute festlegen , um dem Verarbeitungsthread mehr Zeit für die Verarbeitung einer Nachricht zu geben.

Wenn der Verarbeitungsthread stirbt, muss dies max.poll.interval.mserkannt werden. Wenn jedoch der gesamte Verbraucher stirbt (und ein sterbender Verarbeitungsthread höchstwahrscheinlich den gesamten Verbraucher einschließlich des Heartbeat-Threads zum Absturz bringt), muss er nur session.timeout.mserkannt werden.

Die Idee ist, eine schnelle Erkennung eines fehlerhaften Verbrauchers zu ermöglichen, selbst wenn die Verarbeitung selbst ziemlich lange dauert.

Matthias J. Sax
quelle
Danke Matthias, das räumt viel Verwirrung auf. Die Tatsache, max.poll.interval.msdie als Teil von kafka v 0.10.1 eingeführt wird, war nicht offensichtlich. In diesem Fall session.timeout.mskönnten jedoch Klänge wie dann durch ersetzt werden, heartbeat.interval.msda letzteres eindeutig impliziert, wofür es gedacht ist, oder zumindest eines davon verschwinden sollte?
Deeps
Wenn Sie eine solche Anfrage haben, müssen Sie an die Kafka-Entwickler-Mailingliste schreiben. Es ist eine Community-Entscheidung ... Aber ich denke, session.timeout.msaus Gründen der Abwärtskompatibilität ist es eine gute Wahl , diese zu behalten . Und "heartbeat.interval.ms" ist nicht perfekt, da es nicht anzeigt, dass eine Zeitüberschreitung vorliegt. Vielleicht wäre "heartbeat.max.interval.ms" besser (dennoch ist die Verwendung von "timeout" im Parameternamen ein starker Indikator für die Semantik und würde verloren gehen.)
Matthias J. Sax
@ MatthiasJ.Sax Ich habe eine ähnliche Frage , session.timeout.msbei der mein Verbraucher beim Festlegen von Offsets Ausnahmen macht. Ich wollte sehen, ob Sie mir helfen können.
@ MatthiasJ.Sax, mir ist immer noch nicht klar, warum wir beide brauchen. Nehmen wir an, dass der Verbraucherjob sehr lange braucht, um eine Nachricht zu konsumieren. Beispielsweise sendet der Verbraucher die Nachricht über einen sehr langsamen Ruhegespräch an Dritte. Der Verbraucher kann weiterhin in regelmäßigen Abständen Herzschläge über einen Hintergrund-Thread an den Broker senden. max.poll.interval.ms scheint überflüssig.
Daya
6
Angenommen, Ihr Verbraucher stirbt (oder es gibt einen Fehler mit einer Endlosschleife), aber der Hintergrund-Thread schlägt weiter. In diesem Fall wäre das kein Fortschritt, aber es wäre unentdeckt. Daher max.poll.interval.msist eine Gesundheitsprüfung für Ihren Hauptverarbeitungsthread möglich - mit beiden Konfigurationen können Sie "harte Fehler" (sowohl Heartbeat als auch Hauptthread-Die) schnell erkennen und Ihren Code für eine lange Verarbeitung vereinfachen (mit einer einzigen Konfiguration, die Sie entweder haben) lange Haftzeit oder komplexer Code, um Herzschläge während der Verarbeitung "manuell" auszulösen)
Matthias J. Sax