Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: queue, kafka, backpressure

Что такое backpressure и как его реализовать в системе с очередями сообщений?

Вопрос проверяет знание обработки нагрузки в асинхронных системах, умение проектировать очереди и воркер-пулы.

Короткий ответ

Backpressure — это механизм защиты системы от перегрузки. Он ограничивает скорость обработки, например: ограничение размера очереди, блокировка новых сообщений или использование nack/retry.

Длинный ответ

Backpressure — это фундаментальное понятие в системах очередей и потоковой обработки данных. Оно возникает, когда пропускная способность источника (producer) выше, чем пропускная способность обработчика (consumer). Если не внедрить механизм обратного давления, данные будут скапливаться в памяти или очередях до отказа системы.

Где возникает backpressure

  1. Очереди сообщений (Kafka, RabbitMQ) — если producer пишет быстрее, чем consumer читает.

  2. Сетевые протоколы (TCP) — реализовано встроенно через TCP Window и ACK.

  3. Go каналы — если канал буферизованный и буфер заполнен, send блокируется.

  4. Стриминговые фреймворки (Akka Streams, ReactiveX, Flink) — требуют явной поддержки backpressure.

Примеры реализации

  1. RabbitMQ:

    • Можно задать prefetch_count — ограничение, сколько сообщений consumer может взять “на себя”.

    • Producer при этом будет ждать, пока сообщения не подтвердятся.

  2. Kafka:

    • Consumer читает партиями (max.poll.records).

    • Если consumer не успевает, lag растёт. Producer продолжает писать, но можно включить лимиты на продюсере.

    • Backpressure решается масштабированием consumer group.

  3. 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 будет блокироваться

Типичные ошибки без backpressure

  • Producer пишет бесконечно, consumer не успевает → OOM (out of memory).

  • Очередь растёт бесконтрольно → рост latency, падение SLA.

  • Появляется tail latency (последние сообщения обрабатываются слишком поздно).

  • “Невидимая деградация”: система вроде работает, но backlog в Kafka растёт.

Подходы к решению

  1. Ограничение буфера — каналы фиксированного размера, prefetch, лимиты в Kafka.

  2. Сигнализация продюсеру — если consumer перегружен, producer должен замедлиться (push-pull модель).

  3. Dynamic scaling — добавление новых consumers при росте нагрузки.

  4. Dropping policy — в real-time системах иногда допустимо сбрасывать старые данные (например, метрики).

  5. Prioritization — важные сообщения обрабатываются первыми, остальные ждут.

Вывод:

Backpressure — это способ удержать систему стабильной, даже если нагрузка превышает возможности обработки. Его реализация зависит от технологии:

  • в Go это каналы и worker pool,

  • в RabbitMQ — prefetch_count,

  • в Kafka — consumer groups и лимиты.

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

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    3

  • Сложность:

    9

Навыки

  • Golang

    Golang

  • RabbitMQ

    RabbitMQ

  • Kafka

    Kafka

Ключевые слова

#queue

#kafka

#backpressure

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.