2016-12-06 2 views
0

Wie die Reihenfolge der Nachrichten während Verbraucher Neuverteilung gewährleistet ist. zunächst Angenommen, wir haben vier Partitionen: P1, P2, P3, P4 und zwei Verbraucher C1 und C2 (in derselben Gruppe). So erhält jeder Verbraucher beispielsweise zwei Partitionen c1: p1, p2 und c2: p3, p4.Kafka Nachrichtenordnung während Verbraucher Neuverteilung

Nun werden neue Verbraucher hinzugefügt, sagen c3 und c4, Rebalancing passiert, so dass jeder Verbraucher eine Partition wie c1 erhält: p1, c2: p2, c3: p3, c4: p4.

Während dieser Zeit gibt es Chancen, dass Verbraucher c1 könnte die Nachricht von Partition p2 werden Verarbeitung (vor Rebalancing)

und Verbraucher c2 auch Verarbeitung p2 Nachrichten beginnt (nach Rebalancing)

Auch wenn diese Ecke ist Fall, ist das erwartete Verhalten der Nachrichtenreihenfolge?

+0

können Sie ein bisschen mehr klar sein darüber, was die Frage nach Meldung Bestellung? – yaswanth

+1

Nachricht Verarbeitung könnte aus sein oder während Rebalancing – ravthiru

Antwort

2

Während dieser Zeit gibt es Chancen, dass Verbraucher c1 könnte die Nachricht von Partition p2 werden Verarbeitung (vor Rebalancing)

und Verbraucher c2 auch Verarbeitung p2 Nachrichten beginnt (nach Rebalancing)

Ja . Aber wie verhält es sich mit der Bestellung von Nachrichten? Solange kein Fehler vorhanden ist, sollte c1 beenden den aktuellen Datensatz der Verarbeitung (lassen Sie sich mit Offset X sagen) und nach Neuverteilung c2 Datensatz verarbeiten, mit Offset X + 1 wird fortgesetzt.

Und auch wenn ein Fehler auftritt und c1 fehlschlägt, Offset zu committen X - c2 wird einige bereits verarbeitete Nachrichten erneut verarbeiten, aber die Reihenfolge bleibt für die Partition p2 erhalten.

A partitioniert würde nur nicht in Ordnung verarbeitet werden, wenn ein Datensatz mit Offset X1 würde mit Offset-X2 < X1 vor einem Datensatz verarbeitet werden. Aber das ist niemals der Fall (Sie müssen natürlich die Wiederaufbereitung auf Fehler ausschließen).

Lange Rede kurzer Sinn:ja, das ist behavoir nach Design

Wenn Sie eine stateless Anwendung erstellen und jeder Datensatz verarbeitet wird, unabhängig diese Arbeit sehr glatt. Wenn Sie Zustand möchten, müssen Sie sicherstellen, dass der Zustand der Partition p2 es aus Verbrauchern c1 übertragen nach Neuverteilung bis C2 (vor c2 beginnen, Daten zu verarbeiten). Bewegen der Staat tatsächlich ein schwieriges Problem ist, und Sie sollten Kafka Streams prüfen, mit - Kafkas Stream Processing-Bibliothek, die automatisch für Sie diese Handhabung kann: http://docs.confluent.io/current/streams/index.html

+0

Danke, in unserem Fall für einen bestimmten Schlüssel, ist die Verarbeitung der Nachricht in der Reihenfolge ist wichtig, da könnte einige Race-Bedingungen wie nach Rebalance 1) C2 könnte X + 1 verarbeitet haben, bevor C1 X1 von Partition P2 beenden konnte. 2) C1 könnte X1 nicht verarbeiten und C2 beendet die Verarbeitung von X + 1.Danke Wir werden Kafka-Streams betrachten – ravthiru

+0

Beide Szenarien, die Sie beschreiben, sind nicht möglich - entweder C1 hat die Verarbeitung beendet, bevor C2 die Partition übernimmt, oder C1 hat die Verarbeitung nicht beendet und C2 wird den nicht vollständig verarbeiteten Datensatz erneut versuchen. Wenn der Consumer C1 nicht tot ist und weiterhin den Datensatz mit Offset X verarbeitet und die Partitionen widerrufen und an C2 übergeben werden, wird der Broker dies nicht zulassen, weil C1 die Partition nicht mehr besitzt und somit das Commit wird mit einer Ausnahme fehlschlagen. –

+0

Und C2 wird Datensatz mit Offset X parallel zu C1 verarbeiten. Selbst wenn C1 die Verarbeitung von Datensatz X beenden würde, nachdem C2 die Verarbeitung von Datensatz X + 1 beendet hat, spielt es keine Rolle, dass C2 Datensatz X verarbeitet hat, bevor Datensatz X + 1 verarbeitet wurde. Sie könnten also nur mit C2 (X), C2 (X + 1) C1 (X) enden. Nicht sicher, ob die zweite Verarbeitung von X in C1 für Ihre Anwendung schädlich ist oder nicht. –

0

Es gibt eigentlich keine Meldung über Partitionen Bestellung, so ist dies ein erwartetes Verhalten, wo C1 P1 verbraucht, bevor C2 über sie nimmt und beginnt nach einer Neuverteilung zu lesen.

+0

Alle Verbraucher sind in der gleichen Gruppe, ist es Nachricht Reihenfolge mit in der gleichen Partition während der Neuverteilung – ravthiru