2017-08-19 2 views
1

Ich habe einen Anwendungsfall, wo ich möchte, dass der Verbraucher immer von der neuesten Offset starten. Ich muss keine Offsets für diesen Kunden festlegen. Dies ist mit Spring-Kafka nicht möglich, da eine neue Consumer-Gruppe immer neu zugewiesene Partitionen festlegt. Bei nachfolgenden Starts des Programms liest der Verbraucher dann von diesem gespeicherten Offset und nicht von dem neuesten. Mit anderen Worten, nur der allererste Start mit einer neuen Verbrauchergruppe verhält sich korrekt, d. H. Verbraucht spätestens. Das Problem ist in KafkaMessageListenerContainer$ListenerConsumer.onPartitionsAssigned()auto-offset-reset = neueste funktioniert nicht im Frühjahr-kafka

Als Referenz habe ich die folgenden im Frühjahr Boot

spring.kafka.listener.ack-mode=manual 
spring.kafka.consumer.auto-offset-reset=latest 
spring.kafka.consumer.enable-auto-commit=false 

Antwort

1

Dieser Code wurde hinzugefügt einige böse Rennbedingungen zu lösen, wenn eine Neuaufteilung aufgetreten, während eine neue Verbrauchergruppe raubend gestartet; Je nach Konfiguration kann dies zu verlorenen oder doppelten Datensätzen führen.

Es war am besten, den anfänglichen Offset zu begehen, um diese Bedingungen zu vermeiden.

Ich stimme jedoch zu, dass, wenn der Benutzer die volle Verantwortung für Offsets übernimmt (mit einem MANUAL ackmode), dann sollten wir das Commit wahrscheinlich nicht machen; Es liegt an dem Benutzercode, mit dem Rennen umzugehen (in Ihrem Fall interessieren Sie sich nicht für verlorene Aufzeichnungen).

Fühlen Sie sich frei, ein GitHub Problem zu öffnen (Beiträge sind willkommen).

In der Zwischenzeit können Sie die Situation vermeiden, indem Ihr Listener ConsumerSeekAware implementiert und das Thema/die Partition während der Zuweisung sucht.

Eine andere Alternative ist die Verwendung einer UUID für die group.id jedes Mal; und du beginnst immer am Ende des Themas.

Verwandte Themen