Skip to content

leetcode-golang-classroom/golang-graceful-shutdown-concept

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

golang-graceful-shutdown

This repository is to demo how to implement graceful shutdown with golang

concept

Why Graceful shutdwon ?

  1. Release Resource Properly
  2. Prevent Memory Leak for unexpected interrupt

technical design

seperate create http server struct and run server

  1. Build
type Server struct {
	server *http.Server
}

func NewServer() *Server {
	mux := http.NewServeMux()

	mux.HandleFunc("/slow", func(w http.ResponseWriter, r *http.Request) {
		log.Println("Slow request started...")
		time.Sleep(8 * time.Second)
		fmt.Fprintf(w, "Slow request completed at %v\n", time.Now())
	})
	return &Server{
		server: &http.Server{
			Addr:    ":8080",
			Handler: mux,
		},
	}
}
  1. Run
func (s *Server) Run(ctx context.Context,
	shutdownTimeout time.Duration,
) error {
  // Run logic
}
  1. Setup channel for signal system interupt and SIGTERM
// just catch any signal below
stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt, syscall.SIGTERM)

select {
case err := <-serverErr:
  return err
case <-stop:
  log.Println("Shutdown signal received")
case <-ctx.Done():
  log.Println("Context cancelled")
}
  1. Shutdown with timeout
shutdownCtx, cancel := context.WithTimeout(
  context.Background(), // prevent inheriant cancellation
  shutdownTimeout,
)
defer cancel() // clear up resource

if err := s.server.Shutdown(shutdownCtx); err != nil {
  if closeErr := s.server.Close(); closeErr != nil {
    return errors.Join(err, closeErr)
  }
  return err
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published