GraphLMS

Go
0/32 решеноНачать
ТопикиТопик 07

Воркер-пулы и конвейеры

0/10 решено0%

О чём этот блок

Воркер-пул — самая частая боевая абстракция в Go-бэкенде: фиксированный набор горутин разбирает поток задач, не плодя горутину на каждый запрос. Этот блок — самый большой и самый практический. Вы пройдёте пул во всех его боевых вариациях: масштабирующийся под нагрузку, устойчивый к панике, приоритетный, сохраняющий порядок, ограниченный по rps, учитывающий контекст задач, маршрутизирующий по тегам, корректно завершающийся, периодический и засыпающий при простое.

Сквозная тема — жизненный цикл воркеров и задач: как запустить, как распределить работу, как ограничить ресурсы, как остановиться без потерь и утечек. Освоив эти десять задач, вы сможете собрать промышленный пул под почти любое требование, а не только канонический «N воркеров читают из канала».

Что вы научитесь делать

  • Динамически масштабировать число воркеров между min и max под нагрузку.
  • Изолировать панику в задаче через recover, не роняя пул.
  • Обслуживать задачи по приоритету и при этом не блокировать Submit.
  • Сохранять порядок результатов при параллельной обработке.
  • Ограничивать суммарный темп вызовов по всему пулу (rps) внутри конвейера.
  • Уважать контекст каждой задачи и graceful shutdown с таймаутом.
  • Строить pub/sub-маршрутизацию и периодическое (cron) исполнение на общем пуле.

Карта задач

  • 23 · Worker Pool с динамическим масштабированием — рост числа воркеров под очередь и сжатие при простое; границы minWorkers/maxWorkers.
  • 24 · Panic-Safe Worker Poolrecover в воркере; отправка ошибки в 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.

Связанные главы учебника

// Идиома блока: воркер читает задачи из канала и завершается по его закрытию.
func (p *Pool) worker() {
    defer p.wg.Done()
    for task := range p.tasks { // выйдет, когда tasks закроют
        task()
    }
}

Задачи топика 10

23Worker Pool с динамическим масштабированиемfunctionalhard24Panic-Safe Worker Poolfunctionalmedium25Priority Worker Poolfunctionalhard26Ordered Worker Poolfunctionalhard27Rate-Limited Pipeline (2 стадии, 50 RPS)functionalmedium28Context-Aware Worker Poolfunctionalmedium29Fan-Out с маршрутизацией по тегам (Pub/Sub)functionalmedium30Graceful Shutdown с таймаутомfunctionalmedium31Cron Worker Pool (периодические задачи)functionalmedium32Idle Timeout Pool (засыпающие воркеры)functionalhard