정상적인 종료

3700 단어 learningo
프로그램의 정상적인 종료에는 다음이 포함됩니다.
  • SIGTERM(알림) 보내기
    종료될 프로그램), 이 신호를 수신하면 프로그램이 추가 요청 수신을 중지합니다(웹 요청, 데이터베이스 작업 등일 수 있음)
  • .
  • 진행 중/대기 중인 작업 완료(진행 중인 데이터)
  • 리소스(파일 잠금, 메모리) 해제 및 종료(종료 상태 0 포함)

  • 프로세스는 서든 데스(예: 정전, 하드웨어 장애)에 대해 견고해야 합니다. 이러한 시나리오에는 강력한 메시지 큐(beanstalkd)를 사용하는 것이 좋습니다.

    대기열 개념-
  • 생산자가 대기열(예: json, xml)에 작업을 넣음
  • 소비자가 해당 대기열을 모니터링하고 사용 가능한 작업을 가져오거나 예약합니다
  • .
  • 소비자가 대기열에서 작업을 삭제합니다
  • .

    읽기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 (컨텍스트 시간 초과의 경우)

    좋은 웹페이지 즐겨찾기