Senior
Πώς υλοποιείται ένα graceful shutdown; Πώς καταλαβαίνεις πότε είναι η ώρα για ένα graceful shutdown;
sobes.tech AI
Απάντηση από AI
Ο ομαλός τερματισμός (graceful shutdown) είναι η σωστή ολοκλήρωση της εφαρμογής, κατά την οποία αυτή καταφέρνει να ολοκληρώσει τις τρέχουσες λειτουργίες, να απελευθερώσει πόρους και να κλείσει σωστά τις συνδέσεις.
Στη γλώσσα Go, αυτό υλοποιείται συνήθως με την ανίχνευση σημάτων συστήματος (π.χ., SIGINT, SIGTERM) χρησιμοποιώντας το πακέτο os/signal. Όταν η εφαρμογή λαμβάνει σήμα τερματισμού, ξεκινά η διαδικασία ομαλού τερματισμού.
Παράδειγμα:
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("Κλείσιμο διακομιστή...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
fmt.Println("Ο διακομιστής τερματίστηκε βίαια:", err)
}
}()
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
fmt.Println("Σφάλμα διακομιστή:", err)
}
fmt.Println("Ο διακομιστής έκλεισε σωστά")
}
Η κατανόηση πότε πρέπει να γίνει graceful shutdown μπορεί να βασίζεται σε σήματα του λειτουργικού συστήματος ή σε εσωτερικά γεγονότα (π.χ., εντολή διαχειριστή, υπέρβαση ορίων, σφάλματα). Συνήθως, αυτό ανιχνεύεται μέσω εξωτερικών σημάτων τερματισμού της διαδικασίας.