【Go】HTTP 서버가 exit하기 직전에, 후시말 처리를 넣는다! (커넥션 개방이라든가)
6852 단어 HttpServer오류 해결RedisREST-API5
이번에 소개하는 것은 이쪽의
nasa9084/syg
입니다.htps : // 기주 b. 코 m/나사 9084/syg
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/syg
의 README.md
가 조금 낡았는지, 그쪽의 예에서는 defer cancel()
의 코드가 빠져 있으므로, 작자님 사이트의 예 코드나 syg_example_test.go
등을 참조하면 좋을까 생각합니다.
사이고에게
···
라고 할까, 원래 틀렸습니다・・・
아니, 이 기사 그 자체는 아닙니다만, go-redis/redis
는 미리 커넥션 풀의 구조를 내포하고 있어 사용수측은 신경쓰지 않고 NewClient()
, Close()
를 해도 좋다고 합니다
실제로 goroutine을 사용하여 NewClient()
, Close()
를 매번 호출하는 코드와 비교했지만 전혀 문제가 없었습니다.
··· 음, 공부가 되었기 때문에 좋아!
Reference
이 문제에 관하여(【Go】HTTP 서버가 exit하기 직전에, 후시말 처리를 넣는다! (커넥션 개방이라든가)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yagrush/items/15096b654d167e95a416
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
예를 들어 이런 식으로, 신호를 받았을 때에 발동하는 콜백 함수에, 좋아하는 후시말 처리를 넣는 것만
제 경우에는 풀링하고있는 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/syg
의 README.md
가 조금 낡았는지, 그쪽의 예에서는 defer cancel()
의 코드가 빠져 있으므로, 작자님 사이트의 예 코드나 syg_example_test.go
등을 참조하면 좋을까 생각합니다.
사이고에게
···
라고 할까, 원래 틀렸습니다・・・
아니, 이 기사 그 자체는 아닙니다만, go-redis/redis
는 미리 커넥션 풀의 구조를 내포하고 있어 사용수측은 신경쓰지 않고 NewClient()
, Close()
를 해도 좋다고 합니다
실제로 goroutine을 사용하여 NewClient()
, Close()
를 매번 호출하는 코드와 비교했지만 전혀 문제가 없었습니다.
··· 음, 공부가 되었기 때문에 좋아!
Reference
이 문제에 관하여(【Go】HTTP 서버가 exit하기 직전에, 후시말 처리를 넣는다! (커넥션 개방이라든가)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yagrush/items/15096b654d167e95a416
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
···
라고 할까, 원래 틀렸습니다・・・
아니, 이 기사 그 자체는 아닙니다만,
go-redis/redis
는 미리 커넥션 풀의 구조를 내포하고 있어 사용수측은 신경쓰지 않고 NewClient()
, Close()
를 해도 좋다고 합니다 실제로 goroutine을 사용하여
NewClient()
, Close()
를 매번 호출하는 코드와 비교했지만 전혀 문제가 없었습니다.··· 음, 공부가 되었기 때문에 좋아!
Reference
이 문제에 관하여(【Go】HTTP 서버가 exit하기 직전에, 후시말 처리를 넣는다! (커넥션 개방이라든가)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yagrush/items/15096b654d167e95a416텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)