2017-07-12 6 views
0

Mit der letzten Version von Kafka 0.11.0.0 stellt das Apache-Team idempotente Producer und Transaktionen vor. Ist es möglich zu garantieren, dass eine ganze Reihe von Nachrichten (zum Beispiel 1 Million), die wir protokollieren wollen, erst am Ende festgeschrieben werden? Ich möchte das, wenn zum Beispiel die Produzenten die Verbindung zu den Brokern verlieren und sie nicht wieder herstellen können, werden keine Nachrichten von den Konsumenten gesehen werden. Ist es möglich?Garantierte einmalige globale Transaktion für Kafka-Produzenten

Antwort

2

Ja, dies ist möglich mit Transaktionen in Ihrem Hersteller. Sie starten eine Transaktion, veröffentlichen alle Ihre Nachrichten und bestätigen die Transaktion. Alle Nachrichten werden einzeln nach Kafka geschrieben, aber die Benutzer im neuen READ_COMMITTED-Modus sehen die Nachrichten erst, nachdem die Transaktion vom Hersteller festgeschrieben wurde und ein spezieller Transaktionsmarker zum Kafka-Commit-Protokoll hinzugefügt wird.

Verbraucher, die nicht im READ_COMMITTED-Modus sind, können die Nachrichten so sehen, wie sie einzeln geschrieben werden, obwohl sie möglicherweise noch nicht (oder nie) festgeschrieben wurden.

Es gibt eine Grenze für die Länge einer offenen Transaktion, die nicht festgeschrieben werden kann. Wenn der Produzent stirbt und die Transaktion nicht explizit beendet wird, werden Timeout- und Rollback- und READ_COMMITTED-Konsumenten diese Nachrichten nie sehen.

+0

Das kann ich pro Produzent garantieren, oder? Wenn ich mit 3 Produzenten parallelisieren möchte, kann ich keine globale Einzeltransaktion garantieren ... Richtig? – rh0x

+1

Korrekt. Pro Produzent, nicht global –