awesome-everything EN
↑ Обратно к восхождению

Очереди, потоки, события

Partition в Kafka: чтение кода и конфигов

Суть Читайте реальный код producer, конфиг consumer, арифметику partition и лог rebalance, предсказывайте поведение и выбирайте исправление с наибольшим рычагом.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Баги partition диагностируются в коде producer, конфиге consumer и логах rebalance — не в прозе. Прочитайте каждый сниппет, предскажите, что с ним сделает Kafka, и выберите исправление, которое senior-инженер сделал бы первым.

Цель

Отработайте цикл, который вы запускаете в каждом инциденте Kafka: прочитать key producer, конфиг consumer, арифметику partition и лог rebalance, затем взяться за исправление, уважающее порядок и параллелизм, а не замазывающее их.

Сниппет 1 — key producer

// События заказа: created, paid, shipped, cancelled все идут сюда
ProducerRecord<String, OrderEvent> record =
    new ProducerRecord<>("order-events", event.getType(), event);
//                                       ^^^^^^^^^^^^^^^^^
//                                       key = ТИП события, не id заказа
producer.send(record);
Викторина

Consumer должен обрабатывать события каждого заказа по порядку (created до cancelled). При таком keyed что произойдёт и как исправить?

Сниппет 2 — арифметика partition

# Дефолтный partitioner в стиле murmur2: partition = hash(key) % N
def partition_for(key, N):
    return hash(key) % N

# orderId "A-4711" до и после увеличения partition
partition_for("A-4711", 6)    # -> 2
partition_for("A-4711", 12)   # -> 8     # тот же key, другой partition!
Викторина

Топик подняли с 6 до 12 partition на живом. Читая эту арифметику, каково последствие для key A-4711 и почему это нельзя отменить?

Сниппет 3 — конфиг consumer

# Consumer group: payments-processor, 4 инстанса за rolling-деплоем
group.id=payments-processor
session.timeout.ms=10000
heartbeat.interval.ms=3000
# group.instance.id НЕ задан
partition.assignment.strategy=org.apache.kafka.clients.consumer.RangeAssignor
Викторина

Каждый rolling-деплой вызывает многосекундную остановку потребления по всей группе. Читая этот конфиг, в чём причина и какое изменение с наименьшим риском?

Сниппет 4 — лог rebalance

[Consumer clientId=c3, groupId=payments] (Re-)joining group
[Consumer clientId=c3, groupId=payments] Lost previously assigned partitions order-events-2, order-events-5
[Consumer clientId=c3] Revoke previously assigned partitions order-events-2, order-events-5
... 7 таких циклов за 90 секунд ...
[Consumer clientId=c3] Member c3 sending LeaveGroup request due to consumer poll timeout has expired
Викторина

Читая этот лог — повторяющиеся циклы join/revoke, завершающиеся LeaveGroup по poll-timeout, — каков режим сбоя и каково первое исправление?

Итог

Каждый инцидент с partition читается в коде, конфиге и логах: key producer решает, что остаётся упорядоченным (keyed по сущности, а не по типу события); hash(key) % N означает, что увеличение partition перенаправляет живые key и его нельзя отменить; eager-assignor плюс отсутствующий group.instance.id делает каждый деплой stop-the-world rebalance; а цикл join/revoke, завершающийся poll-timeout, — это rebalance-шторм из-за медленной обработки, а не проблема broker или partition. Сначала читайте key и конфиг, исправляйте структурную причину, затем сверяйтесь с метриками lag и rebalance.

Продолжить восхождение ↑Partition в Kafka: сломать и починить порядок по key
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.