Должны ли происходить фиксации транзакции потребителя Kafka в последовательном порядке в модели потребления-преобразования-публикации? - PullRequest
0 голосов
/ 26 августа 2018

Я потратил довольно много времени в поисках ответа на следующий вопрос и нашел один пост на этот счет, но не уверен, что он применим к модели потребление-трансформации-публикации, включенной в v0.11 +.

Предположим, что Kafka v1.1 и три издателя пишут в один обрабатывающий раздел ввода.Каждый публикует «пакет» сообщений и фиксирует только пакет.Кроме того, потребитель обработки этого входного раздела должен ТОЛЬКО преобразовывать (и фиксировать в выходной раздел) весь пакет или ни одного.Однако каждое пакетное сообщение может чередоваться с другими пакетными сообщениями в разделе раздела.Например, пакет из двух записей от трех издателей может выглядеть следующим образом:

P1 writes Message p1-m1
P2 writes Message p2-m1
P1 writes Message p1-m2
P1 commits
P3 writes Message p3-m1
P2 writes Message p2-m2
P2 commits.
P3 writes Message p3-m2
(P3 not yet committed.)

Теперь раздел выглядит следующим образом: сообщения p1 и p2 зафиксированы их издателем, а сообщения p3 еще не зафиксированы:

Offset 1:   p1-m1
Offset 2:   p2-m1
Offset 3:   p1-m2
Offset 4:   p3-m1   not committed
Offset 5:   p2-m2
Offset 6:   p3-m2   not committed

Обрабатывающий потребитель опрашивает только сообщения read_committed и, следовательно, получает сообщения со смещениями 1–3. Он распознает (по данным), что у него есть одна полная партия p1 и одна неполная партия p2.Он преобразует записи P1, начинает новую транзакцию в выходной теме, записывает в выходную тему, передает смещения 1 и 3 из раздела входной темы через sendOffsetsToTransaction и фиксирует пакет.

Между тем P3 затем фиксирует - так что теперь все сообщения были зафиксированы - но ....на этом этапе процессор-потребитель решает уйти, оставляя смещение потребления незаполненным 2.

Что происходит?С одной стороны, мы должны передать каждое поглощающее смещение в sendOffsetToTransaction, подразумевая, что каждое независимо помечено как зафиксированное для потребления.Если это так, то, по-видимому, это означает, что следующий потребитель, получивший доступ к разделу ввода, будет опрашивать и получать сообщения со смещением 2, 4, 5 и 6, верно?

Или сообщение со смещением 2 потеряно, потому что мы зафиксировали смещение 3 перед обработкой смещения 2?Если так, то какова причина того, что каждый вызов-смещение при передаче sendOffsetsToTransaction должен передавать каждое из потребляющих смещений - когда достаточно просто передать последнее?

...