http - 流式传输 HTTP 客户端需要很长时间才能收到第一个响应字节

标签 http go

我正在尝试编写一个用于从 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: 我无法更改我为其编写客户端的服务器。

最佳答案

超时设置对这个问题不起作用,您需要重新设计您的应用程序。

也许您可以在服务器端执行以下操作:

  1. 获取请求参数
  2. 将它们转换为缓存键(文件名、内存缓存、数据库键 - 无论您喜欢什么),例如通过对参数进行排序并使用 SHA-1/-256/512 对它们进行哈希处理
  3. 检查当前是否正在处理此缓存键(例如,是否存在锁)- 如果为真,则返回类似“稍后重试”的内容
  4. 将长时间运行的工作插入后台进程(也许使用 Gearman?)并返回“稍后重试”

在后台:

  1. 为缓存键创建一个锁,包括一个合理的超时时间
  2. 创建您的数据(运行数小时的部分)
  3. 将结果写入缓存

您的客户可以轻松发送请求并立即获得结果。结果可能是“稍后重试”或来自缓存的结果。如果客户端收到“稍后再试”消息,则应休眠一段时间,然后重试请求。

关于http - 流式传输 HTTP 客户端需要很长时间才能收到第一个响应字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49818582/

相关文章:

java - cURL 发布到 Jenkins 上的 Splunk HEC

http - 允许 http 和 https 指向托管在 GCP 存储桶上的我的静态网站

google-chrome - Chrome 扩展 : how to intercept requested urls?

javascript - 监听 http 80 端口时出现 Node.js EACCES 错误(权限被拒绝)

pointers - 变量赋值和引用传递有什么区别?

java - 可以在 HttpServletResponse.sendRedirect() 中发送隐藏参数吗?

go - 并发文件系统扫描

go - 声明类型 *big.Int 溢出常量 golang

Go 命令使用 kubectl 获取更新的输出

go - 为什么没有为命名指针类型定义方法?