Назад к вопросам
Senior
8
Как реализовать graceful shutdown? Как понять что пора делать graceful shutdown?
Компании, где спрашивали
Гос крипта
Ответ от нейросети
sobes.tech AI
Graceful shutdown — это корректное завершение работы приложения, при котором оно успевает завершить текущие операции, освободить ресурсы и корректно закрыть соединения.
В Go это обычно реализуется через ловлю системных сигналов (например, SIGINT, SIGTERM) с помощью пакета os/signal. Когда приложение получает сигнал завершения, оно начинает процесс graceful shutdown.
Пример:
import (
"context"
"fmt"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
srv := &http.Server{Addr: ":8080"}
// Канал для сигналов
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-quit
fmt.Println("Shutting down server...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
fmt.Println("Server forced to shutdown:", err)
}
}()
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
fmt.Println("Server error:", err)
}
fmt.Println("Server exited properly")
}
Понять, что пора делать graceful shutdown, можно по сигналам ОС или внутренним событиям (например, команда от администратора, превышение лимитов, ошибки). Обычно это внешние сигналы завершения процесса.