我正在尝试编写一个用于从 HTTP 服务器流式传输事件数据的 Go HTTP 客户端。我的问题是响应的第一个字节可能需要几个小时才能得到,这包括响应 header 。我什至可能永远得不到回应。
我目前 net/http: request canceled (Client.Timeout exceeded while waiting headers)
使用这个客户端:
Client = &http.Client{
Transport: &http.Transport{
Dial: (&net.Dialer{
Timeout: 0,
KeepAlive: 30 * time.Second,
}).Dial,
Proxy: http.ProxyURL(proxyUrl),
ResponseHeaderTimeout: 0,
},
Timeout: 0,
}
我想不出任何更多的超时设置为零以使我的连接不超时。我错过了什么?
我正在使用 go version go1.8 linux/amd64
。
编辑 1: 我无法更改我为其编写客户端的服务器。
最佳答案
超时设置对这个问题不起作用,您需要重新设计您的应用程序。
也许您可以在服务器端执行以下操作:
- 获取请求参数
- 将它们转换为缓存键(文件名、内存缓存、数据库键 - 无论您喜欢什么),例如通过对参数进行排序并使用 SHA-1/-256/512 对它们进行哈希处理
- 检查当前是否正在处理此缓存键(例如,是否存在锁)- 如果为真,则返回类似“稍后重试”的内容
- 将长时间运行的工作插入后台进程(也许使用 Gearman?)并返回“稍后重试”
在后台:
- 为缓存键创建一个锁,包括一个合理的超时时间
- 创建您的数据(运行数小时的部分)
- 将结果写入缓存
您的客户可以轻松发送请求并立即获得结果。结果可能是“稍后重试”或来自缓存的结果。如果客户端收到“稍后再试”消息,则应休眠一段时间,然后重试请求。
关于http - 流式传输 HTTP 客户端需要很长时间才能收到第一个响应字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49818582/