Корректное завершение работы
Обработка сигналов OS и завершение активных соединений
«Корректное завершение работы» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Зачем нужно корректное завершение
Вызов os.Exit или простая остановка сервера прерывает все выполняющиеся запросы. Корректное завершение ожидает окончания активных запросов перед выходом.
http.Server.Shutdown
srv.Shutdown(ctx) прекращает принимать новые соединения, ожидает завершения активных запросов и затем возвращает управление. Передайте контекст с крайним сроком, чтобы ограничить время ожидания.
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
srv.Shutdown(ctx)Обработка сигналов
Ожидайте SIGINT/SIGTERM в горутине и вызывайте Shutdown после получения сигнала:
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("shutting down...")
srv.Shutdown(ctx)Полный шаблон корректного завершения
Запустите сервер в горутине, ожидайте сигнала в канале, а затем завершите работу:
go func() {
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
log.Fatal(err)
}
}()
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
srv.Shutdown(ctx)http.ErrServerClosed
После вызова Shutdown функция ListenAndServe возвращает http.ErrServerClosed. Считайте это обычным завершением, а не ошибкой.
Освобождение соединений
Shutdown ожидает завершения всех перехваченных соединений и активных соединений WebSocket только в том случае, если сам обработчик учитывает отмену контекста. Обработчики длительного опроса или потоковой обработки должны проверять r.Context().Done().
Время ожидания завершения
Задайте разумное время ожидания завершения (10–30 с). Если после истечения крайнего срока запросы всё ещё выполняются, Shutdown возвращает context.DeadlineExceeded, а оставшиеся соединения принудительно закрываются.
Очистка при завершении
После возврата Shutdown последовательно закройте пулы подключений к базе данных, сбросьте буферы журналов и освободите остальные ресурсы. Используйте defer или явное задание порядка действий.
srv.Shutdown(ctx)
db.Close()
logger.Sync()Server.Close и Server.Shutdown
srv.Close() немедленно закрывает все соединения, не ожидая их завершения. Используйте его только тогда, когда допустима принудительная остановка, например в тестах.
Проба готовности Kubernetes
Во время завершения сначала измените пробу готовности так, чтобы она возвращала 503, а затем вызовите Shutdown. Это сообщает балансировщику нагрузки, что новые запросы больше не следует направлять на модуль.
Несколько серверов
Если запущено несколько серверов (HTTP + gRPC + метрики), завершайте работу каждого параллельно в горутинах и используйте WaitGroup, чтобы дождаться освобождения всех соединений.
Быстрая проверка
Что делает http.Server.Shutdown?
Итоги: корректное завершение
Ключевые моменты:
- srv.Shutdown(ctx) прекращает принимать новые соединения и ожидает завершения активных
- Ожидайте SIGINT/SIGTERM с помощью signal.Notify
- При завершении ListenAndServe возвращает http.ErrServerClosed — это не ошибка
- Задавайте крайний срок завершения, чтобы не ждать бесконечно
Часто задаваемые вопросы
Урок «Корректное завершение работы» бесплатный?
Да — полный текст урока «Корректное завершение работы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Корректное завершение работы»?
Обработка сигналов OS и завершение активных соединений Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Корректное завершение работы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Создание HTTP-сервера
- Маршрутизация и параметры пути
- Шаблон промежуточного обработчика
- Корректное завершение работы