1

我正在尝试使用他们的 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 秒超时)。

我以前特别遇到过托管虚拟机的保活问题,但谷歌表示应该修复它。有谁知道如何避免这个问题?

我正在以这种方式创建一个 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}
}
4

0 回答 0