HTTP/2 API を使用して Apple の APNS サービスにリクエストを送信しようとしています。私のサービスはローカルでは正常に動作していますが、マネージド VM 上にあると、基盤となるソケットが数分後に停止しているように見え、Go HTTP ライブラリが優雅に扱うことはできません。
私が見ているのは、しばらくの間、リクエストが正常に機能している(応答を取得している)ことですが、数分間アイドル状態の場合、接続がタイムアウトするのに数分かかりますread tcp 172.17.0.4:35395->17.172.234.19:443: read: connection timed out
(指定した10秒のタイムアウトを無視しているようです)。
特にマネージド VM でキープアライブの問題が発生したことがありますが、Google は修正する必要があると指摘しています。この問題を回避する方法を知っている人はいますか?
この方法で HTTP/2 クライアントを作成しています。
func NewClient() *http.Client {
cert, err := tls.LoadX509KeyPair("secrets/prod_voip.pem", "secrets/prod_voip.key")
if err != nil {
log.Fatalln(err)
}
config := &tls.Config{
Certificates: []tls.Certificate{cert},
}
config.BuildNameToCertificate()
dialer := &net.Dialer{
Timeout: 10 * time.Second,
}
transport := &http.Transport{
Dial: dialer.Dial,
TLSClientConfig: config,
}
// Explicitly enable HTTP/2 as TLS-configured clients don't auto-upgrade.
// See: https://github.com/golang/go/issues/14275
if err := http2.ConfigureTransport(transport); err != nil {
log.Fatalln(err)
}
return &http.Client{Transport: transport}
}