Перейти к содержимому
14 / 15

Грациозное завершение сервиса на Go: остановить всё и ничего не потерять

Грациозное завершение — это последовательность, а не один вызов. Сервис ловит SIGTERM через signal.NotifyContext, перестаёт принимать новые запросы, дожидается уже начатых, останавливает фоновые задачи, закрывает соединения с базой и брокером — и всё это укладывается в отведённый оркестратором срок. У http.Server для этого есть Shutdown(ctx): он закрывает слушающие сокеты и ждёт завершения активных обработчиков, возвращая ошибку по истечении контекста. Порядок важен и обратен порядку запуска: сначала входящий трафик, потом фоновые задачи, в конце — ресурсы, иначе обработчик обратится к уже закрытому пулу. Две детали, которые чаще всего забывают. В Kubernetes SIGTERM приходит одновременно с удалением пода из списка адресов, поэтому нужна короткая пауза перед началом остановки, иначе часть запросов придёт в уже закрывающийся сервис. И ListenAndServe при штатной остановке возвращает http.ErrServerClosed — это не ошибка.

Грациозное завершение сервиса на Go: остановить всё и ничего не потерять | JScriptiser