【Go】HTTP 서버가 exit하기 직전에, 후시말 처리를 넣는다! (커넥션 개방이라든가)



이번에 소개하는 것은 이쪽의 nasa9084/syg입니다.
htps : // 기주 b. 코 m/나사 9084/syg
  • Golang : 쉽게 신호를 청취하고 callback 함수를 호출합니다.
    htps : // bg.ぇb-아 ps. ch / go-g-l-lee-mply /

  • 이것을 사용하면, HTTP 서버가 exit(정지)하기 전에, 임의의 코드를 넣어 버립니다.
    고맙습니다 ... 고맙습니다 ...

    경위



    Go에서 HTTP RESTAPI 서비스를 만들고 있으며, 그 중에서 Redis의 연결을 풀어 사용하는 기능을 만들었습니다.
    그러면 역시, 서비스가 종료(HTTP 서버가 정지)할 때에 커넥션을 제대로 개방해야 합니다.

    「하지만, http.ListenAndServe 를 실행하고 있는 곳에 defer func 를 걸면 좋을 뿐이지요? 조금 조금♪」

    그리고 나메가 있다면 ...
    defer func 실행되지 않습니다! !

    분명히 os.Exit(code int)가 발동하면 defer가 숨겨져 버린다는 것. 무슨 일이야

    거기서 찾아낸 것이 이쪽이 됩니다.

    사용 예



    예를 들어 이런 식으로, 신호를 받았을 때에 발동하는 콜백 함수에, 좋아하는 후시말 처리를 넣는 것만

    제 경우에는 풀링하고있는 Redis의 연결을 Close()하고 있습니다.
    package main
    
    import (
        "context"
        "fmt"
        "github.com/go-redis/redis"
        "net/http"
        "os"
        "github.com/nasa9084/syg"
    )
    
    var pooledKVSConnectionsMap = make(map[*redis.Options]*redis.Client)
    
    func main() {
        s := &http.Server{Addr: ":8080"}
        waitCh := make(chan struct{})
    
        cancel := syg.Listen(func(os.Signal) {
            s.Shutdown(context.Background())
            destruct() // <--- 仕込み!
            close(waitCh)
        }, os.Interrupt)
        defer cancel()
    
        if err := s.ListenAndServe(); err != http.ErrServerClosed {
            fmt.Print("listening server error:" + err.Error())
        }
        <-waitCh
    }
    
    func destruct() {
        for _, kvsCon := range pooledKVSConnectionsMap {
            cerr := kvsCon.Close()
            if cerr != nil {
                fmt.Print(cerr)
            } else {
                fmt.Print(kvsCon, " ... closed.")
            }
        }
    }
    

    주의


    github.com/nasa9084/sygREADME.md 가 조금 낡았는지, 그쪽의 예에서는 defer cancel() 의 코드가 빠져 있으므로, 작자님 사이트의 예 코드나 syg_example_test.go 등을 참조하면 좋을까 생각합니다.

    사이고에게



    ···
    라고 할까, 원래 틀렸습니다・・・

    아니, 이 기사 그 자체는 아닙니다만, go-redis/redis 는 미리 커넥션 풀의 구조를 내포하고 있어 사용수측은 신경쓰지 않고 NewClient() , Close() 를 해도 좋다고 합니다

    실제로 goroutine을 사용하여 NewClient() , Close()를 매번 호출하는 코드와 비교했지만 전혀 문제가 없었습니다.

    ··· 음, 공부가 되었기 때문에 좋아!

    좋은 웹페이지 즐겨찾기