如何解决来自 docker 的“拨号 tcp i/o 超时”的错误处理
我们在 docker 容器中托管了一个调用 REST API 的应用程序,我们想识别网络超时并以特定方式处理它们
现在为了检测超时,我们使用以下代码片段:
if netErr,ok := err.(net.Error); ok && netErr.Timeout() {
// do something...
}
虽然这在捕获某些情况下确实有效,但当我设置集成测试时防火墙/安全组未正确配置且主机无法访问时,会导致以下错误:
Post \"https://notreal.com/endpoint\": dial tcp 10.130.140.150:8443: i/o timeout
在这种情况下,它似乎不属于 net.Error,还有关于如何识别它的想法?
编辑:
看起来这是我们自己的库的问题。该错误最初是实现了 net.Error 但被吞了,只返回字符串,不再实现 Timeout() 或 Temporary()。
解决方法
您必须像在此 SO answer 中看到的那样自己实现它。然而,另一种方法是使用一个外部包,它可以为你做这件事,比如 retryablehttp
。
resp,err := retryablehttp.Get("/foo")
if err != nil {
panic(err)
}
返回的响应对象是 *http.Response,这与您通常从 net/http 获得的内容相同。如果请求失败一次或多次,上述调用将阻塞并以指数退避方式重试。
如果您需要区分暂时性错误和永久性错误(例如不存在的端点),您可以尝试这样的操作(未经本人测试)?
if netErr,ok := err.(net.Error); ok && netErr.Temporary() {
// retry
}
if err != nil {
// unrecoverable error
log.Fatal(err)
}
捕获特定的网络错误可能很乏味,因为有一堆错误 AddrError
、DNSError
和 so on。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。