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

Производительность

Batching: чтение кода и конфига

Суть Читай реальные конфиги продьюсера, окно buffered-writer в Go, цикл split-and-retry и строку метрик батчера; предскажи поведение и выбери фикс с максимальным рычагом.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Баги батчинга прячутся в дефолтах конфига, в отсутствующем таймере и в слишком ретивом ретрае. Читай код и метрики, затем выбери фикс, который senior делает первым.

Цель

Отрепетируй цикл, который ты гоняешь на каждом пути батчинга: прочитай конфиг или горячий цикл, предскажи, какой триггер срабатывает и что ломается, и тянись к фиксу с максимальным рычагом раньше всего прочего.

Сниппет 1 — конфиг продьюсера Kafka

linger.ms=0
batch.size=16384
compression.type=zstd
acks=all
Викторина

Продьюсер на этом конфиге выдаёт сильно ниже ёмкости кластера, пока брокеры скучают. compression.type уже zstd. Какова доминирующая проблема и первый фикс?

Сниппет 2 — buffered writer в Go

func newBatcher(w io.Writer) *bufio.Writer {
    return bufio.NewWriterSize(w, 64*1024) // буфер 64 КБ
}

// горячий путь: многие горутины зовут это
func emit(bw *bufio.Writer, rec []byte) error {
    _, err := bw.Write(rec)        // буферизует; сбрасывает только при заполнении
    return err
}
Викторина

Этот батчер отлично работает под нагрузкой, но его tail latency взрывается, когда ночью трафик падает. Чего не хватает и почему симптом появляется только при низкой нагрузке?

Сниппет 3 — цикл ретрая консьюмера

func process(batch []Record) error {
    for _, r := range batch {
        if err := handle(r); err != nil {
            return err            // прервать весь батч, будет повторён
        }
    }
    return commitOffsets(batch)
}
Викторина

Одна запись в батче необратимо повреждена (handle всегда на ней ошибается). Фреймворк ретраит process(batch) на любую возвращённую ошибку. Что произойдёт и какова правильная структура?

Сниппет 4 — строка метрик батчера

batch.flush reason=timer size=120/4096 recs wait_ms=20.0 depth=12% drops=0
Викторина

Читая одну эту строку метрик батчера, какое утверждение верно?

Итог

Batching читается в конфиге и коде: linger.ms=0 морит батчи голодом и кастрирует компрессию при любом кодеке; size-only-буфер нуждается в таймере max-wait, иначе встаёт при низкой нагрузке; abort-whole-batch-ретрай на необратимой ошибке — poison-message stall, который решают split-and-retry плюс DLQ; а строка метрик батчера сразу говорит reason сброса, долю заполнения, wait, depth и drops — depth и drops ведут, throughput отстаёт. Диагностируй по сигналу, чини причину с максимальным рычагом, затем переизмеряй.

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

Trademarks belong to their respective owners. Editorial reference only.