Web services 使用Gin实现的Go HTTP服务发送大约50%的数据,然后关闭连接,为什么?

Web services 使用Gin实现的Go HTTP服务发送大约50%的数据,然后关闭连接,为什么?,web-services,http,go,connection,Web Services,Http,Go,Connection,我有一个HTTP服务,它向客户端发送非常大的文件(通常在50Mb到100Mb之间)。当我并行启动多个客户端时,我通常会得到部分文件(500Kb到25Mb),然后服务器关闭连接 如果我是唯一一个使用单个连接执行GET的人,则在传输整个文件之前,它不会关闭连接。因此,服务在没有负载的情况下工作 以下是我的杜松子酒处理器的外观: func handler(c *gin.Context) { ...some initialization... // prepare list of re

我有一个HTTP服务,它向客户端发送非常大的文件(通常在50Mb到100Mb之间)。当我并行启动多个客户端时,我通常会得到部分文件(500Kb到25Mb),然后服务器关闭连接

如果我是唯一一个使用单个连接执行
GET
的人,则在传输整个文件之前,它不会关闭连接。因此,服务在没有负载的情况下工作

以下是我的杜松子酒处理器的外观:

func handler(c *gin.Context) {
    ...some initialization...

    // prepare list of readers
    readers := []io.Reader{}
    size := 0

    ...load some data in a []byte buffer...

    // create one reader and stack it in `readers`
    readers = append(readers, bytes.NewReader(data))
    size += len(data)

    ...repeat as needed for this request...

    // create stream
    r := io.MultiReader(readers...)

    // send data
    c.Status(http.StatusOK)  // HTTP 200 response
    c.Header("Content-Length", strconv.FormatInt(size, 10))
    io.CopyN(c.Writer, audioReader, size)
}
正如我所提到的,当我一次执行一个
GET
并等待完成时,该过程工作正常

当我并行运行两个或两个以上的
GET
时,就会出现问题

我想知道Gin TCP连接是否被重用,从而
io.CopyN()
在完成之前被中断。如果是这样,我该如何等待以确保
io.CopyN()
已完成


我知道如果我直接控制套接字,
close()。我做了一些集成测试,可以发送/接收数百个连接并传输Mb的数据,这些测试非常有效。只是在这些测试中,我从来没有并行发送过两个请求(至少现在还没有)。

您似乎正在加载内存中的所有数据,然后发送它。用这种方式处理多个请求时,可能内存不足。@bserdar,我们有150Gb左右的内存。因此,10到100个请求不会因为内存问题而终止服务。此外,该服务也不会重新启动,这在您的场景中是可以想象的。您没有显示如何计算
sendSize
。这有可能是错误的吗?为什么应用程序使用io.CopyN而不是io.Copy?这可能是一个并发错误,因为问题只在存在并发请求时发生。使用运行应用程序。很抱歉,我还支持
范围:…
,因此当发生
范围:…
请求时,
sendSize
可能更小。但是,我可以看到大小,因为我也将其粘贴在
内容长度:…
(添加到上面的示例中)。所以这是正确的。这也是为什么我使用
CopyN()
而不是
Copy()
。请注意,此时我根本没有测试
范围:…
。我发送“普通”
GET
请求。正如我提到的,因为它在我只发送一个请求时就可以工作,所以我相信逻辑是正确的。问题在于我们看不到的代码(要么是…中的代码,要么实际代码与此处发布的代码不同)。