정상적인 종료
종료될 프로그램), 이 신호를 수신하면 프로그램이 추가 요청 수신을 중지합니다(웹 요청, 데이터베이스 작업 등일 수 있음)
프로세스는 서든 데스(예: 정전, 하드웨어 장애)에 대해 견고해야 합니다. 이러한 시나리오에는 강력한 메시지 큐(beanstalkd)를 사용하는 것이 좋습니다.
대기열 개념-
읽기disposability
golang의 정상적인 종료 예
https://pkg.go.dev/os/signal#Notify
package main
import (
"context"
"fmt"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
// Hello world, the web server
helloHandler := func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "You requessted %s - %s", req.URL, req.Method)
fmt.Println("Serving requests from hey...")
time.Sleep(time.Second * 2)
defer fmt.Println("remaining") // acts as remaining requests
}
api := &http.Server{
Addr: ":8080",
Handler: http.HandlerFunc(helloHandler),
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
serverErrors := make(chan error, 1)
shutdown := make(chan os.Signal, 1)
go func() {
log.Printf("main api listening on %s", api.Addr)
serverErrors <- api.ListenAndServe()
}()
signal.Notify(shutdown, os.Interrupt, syscall.SIGTERM)
//above is not blocking operation although waiting on shutdown channel
select {
case err := <-serverErrors:
log.Fatalf("Error while listening and starting http server: %v", err)
case <-shutdown:
log.Println("main: Starting shutdown")
const timeout = 5 * time.Second
// Context - it is used for Cancellation and propagation, the context.Background() gives empty context
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
err := api.Shutdown(ctx)
/*Shutdown gracefully shuts down the server without interrupting any active connections. Shutdown works by first closing all open listeners, then closing all idle connections, and then waiting indefinitely for connections to return to idle and then shut down.If the provided context expires before the shutdown is complete, Shutdown returns the context's error, otherwise it returns any error returned from closing the Server's underlying Listener(s).*/
if err != nil {
log.Printf("main: Graceful shutdown didnot complete in %v:%v", timeout, err)
err = api.Close()
//Close() immediately closes all active net.Listeners and any connections in state StateNew, StateActive, or StateIdle. For a graceful shutdown, use Shutdown.
}
if err != nil {
log.Fatalf("main: could not stop server gracefully Error: %v", err)
}
}
}
추가 읽기: link1 (컨텍스트 시간 초과의 경우)
Reference
이 문제에 관하여(정상적인 종료), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/sherpaurgen/graceful-shutdown-16h1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)