Загрузка…
Загрузка…
Go · middle · сложность 4
Graceful shutdown в Go — контролируемое завершение обслуживания без потери запросов и без «осиротевших» горутин. Идея проста: перестать получать новую нагрузку, дать завершиться активной работе, корректно остановить фон и закрыть ресурсы в предсказуемой последовательности.
Сигналы завершения перехвата (SIGTERM, SIGINT).
Создайте context с таймаутом для фазы выключения.
Вызовите server.Shutdown(ctx):
новые подключения больше не принимаются;
активным запросам дается время на выполнение.
Отмените контекст/подайте сигнал фоновым работникам об остановке.
Дождитесь завершения рабочих процессов (WaitGroup/errgroup).
Закрыть внешние ресурсы (БД, очереди, производители, файлы).
Worker работает в цикле с select, где есть ветка case <-ctx.Done(): return.
При завершении работы основной процесс вызывает функцию отмены.
Рабочий завершает текущий защищенный шаг, выполняет сброс/очистку и exits.
Таймауты обязательны: изящное не должно превращаться в вечное ожидание.
Идемпотентное отключение: повторяющиеся сигналы не нарушают логику отключения.
Наблюдаемость: этапы остановки журнала и показатели продолжительности.
Четкий порядок: сначала прекратите всасывание, затем слейте воду в полете, а затем очистите.
Остановить процесс «жестко» без Shutdown.
Не передавайте ctx рабочим/внешним вызовам.
Не ждите завершения горутин.
Забудьте об очистке буферов/очередей перед выходом.
Правильное плавное завершение работы в Go организуется с помощью сигнала context, server.Shutdown и явным ожиданием всех фоновых задач. Такой подход гарантирует целостность запросов, предсказуемость вывода и надежность работы.
Graceful shutdown в Go — контролируемое завершение обслуживания без потери запросов и без «осиротевших» горутин.