Ich bin nicht klar , warum wir beide brauchen session.timeout.ms
und max.poll.interval.ms
und 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 ?
apache-kafka
kafka-consumer-api
Tiefen
quelle
quelle
Antworten:
Vor KIP-62 gibt es nur
session.timeout.ms
(dh Kafka0.10.0
und früher).max.poll.interval.ms
wird über KIP-62 (Teil von Kafka0.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 folgendenpoll()
) 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 einstellen
session.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.ms
ist für den Heartbeat-Thread, währendmax.poll.interval.ms
es 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 mehrmax.poll.interval.ms
als 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.ms
erkannt 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 nursession.timeout.ms
erkannt werden.Die Idee ist, eine schnelle Erkennung eines fehlerhaften Verbrauchers zu ermöglichen, selbst wenn die Verarbeitung selbst ziemlich lange dauert.
quelle
max.poll.interval.ms
die als Teil von kafka v 0.10.1 eingeführt wird, war nicht offensichtlich. In diesem Fallsession.timeout.ms
könnten jedoch Klänge wie dann durch ersetzt werden,heartbeat.interval.ms
da letzteres eindeutig impliziert, wofür es gedacht ist, oder zumindest eines davon verschwinden sollte?session.timeout.ms
aus 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.)session.timeout.ms
bei der mein Verbraucher beim Festlegen von Offsets Ausnahmen macht. Ich wollte sehen, ob Sie mir helfen können.max.poll.interval.ms
ist 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)