Що визначає компенсацію споживачів Kafka?


169

Я відносно новий в Кафці. Я трохи експериментував з цим, але мені кілька незрозумілих щодо компенсації споживачів. З того, що я зрозумів до цього часу, коли споживач запускає, зміщення, з якого він почне читати, визначається налаштуваннями конфігурації auto.offset.reset(виправте мене, якщо я помиляюся).

Тепер скажімо, наприклад, що в темі є 10 повідомлень (компенсації від 0 до 9), і споживач трапив їх 5, перш ніж він знизився (або до того, як я вбив споживача). Тоді скажіть, що я запускаю цей споживчий процес. Мої запитання:

  1. Якщо значення auto.offset.resetвстановлено smallest, чи завжди він починає споживати з компенсації 0?

  2. Якщо значення auto.offset.resetвстановлено largest, чи почне він споживати з компенсації 5?

  3. Чи завжди поведінка щодо подібного сценарію детермінована?

Будь ласка, не соромтесь коментувати, якщо щось у моєму питанні незрозуміле. Заздалегідь спасибі.

Відповіді:


260

Це трохи складніше, ніж ви описали.
У auto.offset.resetконфігурації стусани в тільки якщо ваша група споживачів не має дійсне зміщення покінчило де - то (2 підтримуються офсетні сховища тепер Кафка і Zookeeper), і це також залежить від того , якого споживача ви використовуєте.

Якщо ви користуєтесь споживачем java високого рівня, тоді уявіть наступні сценарії:

  1. У вас є споживач групи споживачів group1, який спожив 5 повідомлень і помер. Наступного разу, коли ви запускаєте цього споживача, він навіть не буде використовувати цей auto.offset.resetконфігурацію і продовжить місце, де він загинув, оскільки він просто отримає збережене зміщення зі зміщеного сховища (Kafka або ZK, як я вже згадував).

  2. У вас є повідомлення в темі (як ви описали), і ви запускаєте споживача в новій групі споживачів group2. Зсув ніде не зберігається, і цього разу auto.offset.resetконфігуратор вирішить, чи слід починати з початку теми ( earliest) або з кінця теми ( latest)

Ще одна річ, яка впливає на те, яким значенням зміщення відповідатиме earliestта latestналаштовує, - це політика збереження журналу. Уявіть, що у вас тема із затримкою налаштована на 1 годину. Ви створюєте 5 повідомлень, а потім через годину ви публікуєте ще 5 повідомлень. latestЗсув буде по- , як і раніше залишаються такими ж , як і в попередньому прикладі , але earliestодин не зможе бути 0тому , що Кафка вже видалити ці повідомлення і , таким чином , найбільш ранній доступний офсетних буде 5.

Все, що було сказано вище, не пов’язане з цим, SimpleConsumerі кожен раз, коли ви його запустите, він вирішить, з чого почати використовувати auto.offset.resetконфігурацію.

Якщо ви використовуєте Кафка версії старше 0.9, ви повинні замінити earliest, latestз smallest, largest.


3
Дуже дякую за відповідь. Що ж стосується споживача високого рівня, коли споживач чинить щось (або в ZK чи в Kafka), auto.offset.resetце не має після цього жодного значення? Єдине значення цієї установки полягає в тому, що нічого не робиться (і в ідеалі, що було б при першому запуску споживача)?
Асиф Ікбал

2
Точно так, як ви описали
serejja

1
@serejja Привіт - а як бути, якщо у мене завжди є 1 споживач на групу, і сценарій №1 вашої відповіді трапляється для мене? Це було б саме?
ha9u63ar

1
@ ha9u63ar не зовсім зрозумів ваше запитання. Якщо ви перезапустите свого споживача в одній групі, то так, він не буде використовуватись auto.offset.resetі продовжуватиметься після скоєного компенсації. Якщо ви завжди користуєтесь різною групою споживачів (наприклад, auto.offset.reset
генеруйте

@serejja так, і це для мене не працює. Ви можете, будь ласка, поглянути на це - це моє питання
ha9u63ar

82

Просто оновлення: починаючи з Kafka 0.9 і далі, Kafka використовує нову версію Java для споживача, а назви параметрів auto.offset.reset змінилися; З посібника:

Що робити, коли у Kafka немає початкового зміщення або якщо поточного зміщення більше не існує на сервері (наприклад, через те, що дані були видалені):

раннє : автоматично скидає зсув до найбільш раннього зміщення

останнє : автоматично скинути зсув до останнього зміщення

немає : киньте виняток для споживача, якщо не знайдено попереднього компенсації для групи споживачів

нічого іншого: киньте виняток споживачеві.

Я витратив деякий час, щоб знайти це після перевірки прийнятої відповіді, тому я подумав, що громаді може бути корисно опублікувати її.


9

Далі більше є offsets.retention.minutes. Якщо час з моменту останньої фіксації> offsets.retention.minutes, тоді auto.offset.resetтакож починається


1
чи не здається це зайвим із збереженням журналу? чи має бути збереження на основі заснованих на збереженні журналу?
mike01010

@ mike01010 це правильно. Він повинен базуватися на збереженні журналу, ось одне із запропонованих рішень у квитку. Prolong default value of offsets.retention.minutes to be at least twice larger than log.retention.hours. issues.apache.org/jira/browse/KAFKA-3806
saheb

Ця відповідь налякав мене на деякий час, поки я не перевірити документацію по offsets.retention.minutes:. <Б> Після того, як група споживачів втрачає всі свої споживач (тобто стає порожній) його зміщення будуть зберігатися в протягом терміну зберігання перед тим , як відкидається </ b> Для автономного Споживачі (використовуючи ручне призначення), компенсації закінчуються після часу останнього зобов’язання плюс цей період утримання. (Це для Kafka 2.3)
jumping_monkey
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.