Вопрос проверяет знание обработки нагрузки в асинхронных системах, умение проектировать очереди и воркер-пулы.
Backpressure — это механизм защиты системы от перегрузки. Он ограничивает скорость обработки, например: ограничение размера очереди, блокировка новых сообщений или использование nack/retry.
Backpressure — это фундаментальное понятие в системах очередей и потоковой обработки данных. Оно возникает, когда пропускная способность источника (producer) выше, чем пропускная способность обработчика (consumer). Если не внедрить механизм обратного давления, данные будут скапливаться в памяти или очередях до отказа системы.
Очереди сообщений (Kafka, RabbitMQ) — если producer пишет быстрее, чем consumer читает.
Сетевые протоколы (TCP) — реализовано встроенно через TCP Window и ACK.
Go каналы — если канал буферизованный и буфер заполнен, send блокируется.
Стриминговые фреймворки (Akka Streams, ReactiveX, Flink) — требуют явной поддержки backpressure.
RabbitMQ:
Можно задать prefetch_count — ограничение, сколько сообщений consumer может взять “на себя”.
Producer при этом будет ждать, пока сообщения не подтвердятся.
Kafka:
Consumer читает партиями (max.poll.records).
Если consumer не успевает, lag растёт. Producer продолжает писать, но можно включить лимиты на продюсере.
Backpressure решается масштабированием consumer group.
Go worker pool:
jobs := make(chan int, 100) // ограниченный буфер
for i := 0; i < 10; i++ {
go func() {
for job := range jobs {
time.Sleep(time.Second) // медленная обработка
}
}()
}
// если jobs заполнится, producer будет блокироватьсяProducer пишет бесконечно, consumer не успевает → OOM (out of memory).
Очередь растёт бесконтрольно → рост latency, падение SLA.
Появляется tail latency (последние сообщения обрабатываются слишком поздно).
“Невидимая деградация”: система вроде работает, но backlog в Kafka растёт.
Ограничение буфера — каналы фиксированного размера, prefetch, лимиты в Kafka.
Сигнализация продюсеру — если consumer перегружен, producer должен замедлиться (push-pull модель).
Dynamic scaling — добавление новых consumers при росте нагрузки.
Dropping policy — в real-time системах иногда допустимо сбрасывать старые данные (например, метрики).
Prioritization — важные сообщения обрабатываются первыми, остальные ждут.
Backpressure — это способ удержать систему стабильной, даже если нагрузка превышает возможности обработки. Его реализация зависит от технологии:
в Go это каналы и worker pool,
в RabbitMQ — prefetch_count,
в Kafka — consumer groups и лимиты.
Правильный подход: ограничить буфер + сигнализировать продюсеру + масштабировать обработчиков, а не надеяться, что железо выдержит.
Уровень
Рейтинг:
3
Сложность:
9
Навыки
Golang
RabbitMQ
Kafka
Ключевые слова
Подпишись на Golang Developer в телеграм