В прошлом уроке мы научились замечать, что консьюмер отстаёт. Часто причина отставания появилась задолго до него: при выборе ключа, числа партиций или места коммита. Сегодня соберём восемь ошибок, которые чаще всего делают на первом проекте с Kafka. Половину из них мы уже встречали по отдельности, здесь они в одном списке, чтобы по нему можно было пройтись перед запуском.
Чек-лист пилота
Пилот перед взлётом проходит чек-лист, хотя летал тысячу раз. Не потому что забыл, как летать, а потому что ошибки, которые губят самолёты, обычно скучные: не тот закрылок, не тот кран топлива. Их легко пропустить именно из-за уверенности.
Ошибки с Kafka такие же скучные. Каждая по отдельности понятна. Беда в том, что о них не вспоминают, пока Отто не позвонит в пятницу вечером.
1. Горячий ключ
Ключ выбирает партицию, и все сообщения с одним ключом попадают в одну партицию. Если одному ключу достаётся почти весь поток, его партиция перегружена, а соседние простаивают. Такой ключ называют горячим. Добавление консьюмеров не помогает: горячую партицию всё равно читает один.
В «Гонце» так случится, если ключом заказов на кухню сделать ресторан, а у «Пельменной №1» почти все заказы города. Первая часть сценария ниже показывает это.
2. Медленный обработчик
Консьюмер обязан звать poll хотя бы раз в max.poll.interval.ms, по умолчанию 5 минут. Если обработка пачки идёт дольше, группа считает консьюмер зависшим и отдаёт его партиции другим. Он заканчивает работу, зовёт poll, возвращается в группу, и партиции снова перераздаются. Если пачки всегда медленные, группа живёт в ребалансе по кругу. Вторая часть сценария показывает один такой круг.
Лечат это не увеличением тайм-аута до часа, а меньшими пачками (max.poll.records) и быстрой обработкой, а долгую работу выносят из обработчика.
Посмотри сам
kafka-get-offsets показывает перекос: kitchen-orders:0:5, kitchen-orders:1:0, kitchen-orders:2:1. Все пять заказов «Пельменной» в партиции 0, партиция 1 пустая.
Во второй части c1 и c2 делят две партиции. Через четыре минуты c2 зовёт poll, а c1 молчит. Ещё через две минуты c1 молчит уже шесть минут, и заметка ребаланс группы billing, поколение 3 отдаёт обе партиции c2. Потом c1 наконец зовёт poll, возвращается, и поколение 4 снова делит партиции пополам. Два ребаланса подряд, а работы за это время не сделано.
урок из курса
Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.