2017-10-03 5 views
3

ich this one lese:Wie funktioniert das Auto-Commit von kafka consumer?

Automatisches Fest Der einfachste Weg, Offsets zu begehen ist die Verbraucher zu ermöglichen, es für Sie zu tun. Wenn Sie enable.auto.commit = true, konfigurieren, wird der Consumer alle fünf Sekunden den größten Offset Ihres Clients von poll() empfangen. Das Fünf-Sekunden-Intervall ist der Standardwert und wird durch Einstellung von auto.commit.interval.ms gesteuert. Nur wie alles andere im Consumer, werden die automatischen Commits von der Poll-Schleife angetrieben. Wann immer Sie abfragen, überprüft der Konsument, ob es Zeit ist zu committen, und wenn dies der Fall ist, wird es die Offsets committieren, die es in der letzten Abfrage zurückgegeben hat.

Vielleicht Problem, dass mein Englisch nicht gut ist, aber ich verstehe diese Beschreibung nicht vollständig.

Nehmen wir an, ich verwende Auto-Commit mit Standardintervall - 5 Sekunden und Abfrage erfolgt alle 7 Sekunden. In diesem Fall findet ein Commit alle 5 Sekunden oder alle 7 Sekunden statt?

Können Sie das Verhalten erklären, wenn die Abfrage alle 3 Sekunden stattfindet? Wird das Festschreiben alle 5 Sekunden oder alle 6 Sekunden stattfinden?
Ich habe this one lesen:

Auto verpflichtet: Sie auto.commit auf true gesetzt und die auto.commit.interval.ms Eigenschaft mit einem Wert in Millisekunden einstellen. Sobald Sie aktiviert haben, wird der Kafka-Benutzer den Offset der letzten Nachricht als Antwort auf seinen Aufruf poll() bestätigen. Der Aufruf poll() wird im Hintergrund bei der Einstellung auto.commit.interval.ms ausgegeben.

Und es widerspricht der Antwort.

Können Sie dieses Zeug im Detail erklären.

Lassen Sie sagen, ich Diagramm wie dieses:

0 sec -
4 Sek abfragen -
8 Sek abfragen -

abfragen

Wenn Offset tut, wird begangen werden und wann die man ?

+0

"condemmer", ja ... – AKSW

Antwort

3

AutoCommit Check wird bei jeder Abfrage aufgerufen und überprüft, ob die verstrichene Zeit größer ist als die konfigurierte Zeit, wenn ja, dann wird das Commit durchgeführt.

wenn Commitintervall ist 5 Sekunden und Umfrage wird in 7 Sekunden geschieht, In diesem Fall verpflichten die nach 7 sec passieren wird

+0

und zweiten Fall? – gstackoverflow

+0

zweiter Fall folgt der gleichen Logik, für die erste Abfrage wird es nicht als 3 <5 committen, aber bei der nächsten Abfrage wird es als 6> 5 commit und nach dem Festschreiben wird es den Zähler zurücksetzen und das gleiche Muster wird folgen –

+0

Aber wie Commit letzte Umfrage in diesem Fall? Soll ich es manuell machen? – gstackoverflow

1

Es würde versuchen, so schnell wie möglich Autocommit nach Umfrage abgeschlossen ist. Sie können sich den Quellcode des Kundenkoordinators ansehen, der über lokale Felder verfügt, die auf Klassenebene definiert sind, um zu ermitteln, ob Autocommit aktiviert ist, welches Intervall und wann der nächste Termin für Autocommit ist.

https://github.com/apache/kafka/blob/10cd98cc894b88c5d1e24fc54c66361ad9914df2/clients/src/main/java/org/apache/kafka/clients/consumer/internals/ConsumerCoordinator.java#L625

Und einer der Orte innerhalb Umfrage, die einen Anruf durchführen Speicher zu tun https://github.com/apache/kafka/blob/10cd98cc894b88c5d1e24fc54c66361ad9914df2/clients/src/main/java/org/apache/kafka/clients/consumer/internals/ConsumerCoordinator.java#L279

Das alle 7 Sekunden ausgeführt zum Beispiel Umfrage gesagt wird, und autocommit auf 5:

0 - Umfrage, + Termin auf 5. Sekunde setzen

7 - Poll + Commit wegen Termin, Updatetermin auf 7 + 5 = 12

14 - Umfrage + begehen aufgrund Frist, zu aktualisieren Frist bis 12 + 5 = 17

Allerdings, wenn Polling alle 3 Sekunden eingestellt, und autocommit wird auf 5:

0 - Umfrage, + gesetzte Frist bis zur 5. zweiten

3 - Umfrage, kein begehen

6 - Umfrage + begeht aufgrund Frist, zu aktualisieren Frist bis 6 + 5 = 11

+0

Erster Deadline passiert nur in der 6. Sekunde? – gstackoverflow

+0

@gstackoverflow ja, nach dem Quellcode von Kafka-Clients. Ich weiß, es würde sich dumm anhören, aber im Allgemeinen und von welchem ​​Punkt aus möchten Sie das erreichen? In unternehmenskritischen Systemen ist es besser, einen Offset manuell zu übernehmen, wenn Sie sich ziemlich sicher sind, dass die Nachricht verarbeitet wurde. In anderen Fällen bevorzugen Sie möglicherweise weniger häufige Offset-Commits, um den Prozess zu beschleunigen. Allerdings ist das Offset-Commit nicht trivial, da es einen Tierpfleger usw. involvieren würde. – user486075