Воркер-пулы и конвейеры
О чём этот блок
Воркер-пул — самая частая боевая абстракция в Go-бэкенде: фиксированный набор горутин разбирает поток задач, не плодя горутину на каждый запрос. Этот блок — самый большой и самый практический. Вы пройдёте пул во всех его боевых вариациях: масштабирующийся под нагрузку, устойчивый к панике, приоритетный, сохраняющий порядок, ограниченный по rps, учитывающий контекст задач, маршрутизирующий по тегам, корректно завершающийся, периодический и засыпающий при простое.
Сквозная тема — жизненный цикл воркеров и задач: как запустить, как распределить работу, как ограничить ресурсы, как остановиться без потерь и утечек. Освоив эти десять задач, вы сможете собрать промышленный пул под почти любое требование, а не только канонический «N воркеров читают из канала».
Что вы научитесь делать
- Динамически масштабировать число воркеров между
minиmaxпод нагрузку. - Изолировать панику в задаче через
recover, не роняя пул. - Обслуживать задачи по приоритету и при этом не блокировать
Submit. - Сохранять порядок результатов при параллельной обработке.
- Ограничивать суммарный темп вызовов по всему пулу (rps) внутри конвейера.
- Уважать контекст каждой задачи и graceful shutdown с таймаутом.
- Строить pub/sub-маршрутизацию и периодическое (cron) исполнение на общем пуле.
Карта задач
- 23 · Worker Pool с динамическим масштабированием — рост числа воркеров
под очередь и сжатие при простое; границы
minWorkers/maxWorkers. - 24 · Panic-Safe Worker Pool —
recoverв воркере; отправка ошибки вerrsи продолжение работы; пул не падает от паники вfn. - 25 · Priority Worker Pool — приоритетная очередь (1..3); воркеры берут
высший доступный приоритет; неблокирующий
Submit. - 26 · Ordered Worker Pool — параллельная обработка, но выдача результатов
строго в порядке поступления; закрытие
outпо завершении. - 27 · Rate-Limited Pipeline (50 RPS) — двухстадийный конвейер; общий
лимит частоты вызовов
callAPIпо всему пулу воркеров. - 28 · Context-Aware Worker Pool — у каждой задачи свой
ctx; отменённую задачу воркер бросает и берёт следующую, не застревая. - 29 · Fan-Out с маршрутизацией по тегам (Pub/Sub) — подписка по тегу;
доставка сообщения только подписчикам его
Tag; цикл диспетчеризации и дренаж очереди при остановке. - 30 · Graceful Shutdown с таймаутом —
Stopпрекращает приём, даётtimeoutна доделку и возвращает ID не успевших задач. - 31 · Cron Worker Pool — периодические задачи со своими интервалами на общем пуле воркеров без горутины на каждый тик.
- 32 · Idle Timeout Pool — эластичный пул:
minWorkersпостоянных, рост доmaxWorkers, засыпание и выход лишних воркеров послеidleTimeout.
Связанные главы учебника
- Паттерны конкурентности — worker pool, pipeline, fan-out, semaphore, batching.
- sync: примитивы —
WaitGroupдля ожидания воркеров, мьютексы для общего состояния пула. - context — отмена задач, graceful shutdown, таймауты завершения.
// Идиома блока: воркер читает задачи из канала и завершается по его закрытию.
func (p *Pool) worker() {
defer p.wg.Done()
for task := range p.tasks { // выйдет, когда tasks закроют
task()
}
}