获得;“服务器保持空闲连接”;使用MinIO和Go时出错当我连续打开多个连接时,如何解决此问题?

获得;“服务器保持空闲连接”;使用MinIO和Go时出错当我连续打开多个连接时,如何解决此问题?,go,amazon-s3,minio,localstack,Go,Amazon S3,Minio,Localstack,我有一个服务,它想打开28个到不同S3对象的连接,将它们保存在那里,以便以后重用 此时,我正在测试我的代码,以确保它能够正常工作,并避免在实际的S3环境中出现潜在的混乱 当我在一个raw中打开大约8个连接时,一切正常。几乎每次我查看这个数字时,它都会开始创建“服务器保持空闲连接”错误。以下是整个错误的示例: Put:http:server已关闭空闲连接 以防万一,我尝试了一个连接,让它打开了一段时间,没有发送任何东西给它,它工作得很好。没有“空闲连接”错误。所以我很确定错误标签是错的。更可能是由

我有一个服务,它想打开28个到不同S3对象的连接,将它们保存在那里,以便以后重用

此时,我正在测试我的代码,以确保它能够正常工作,并避免在实际的S3环境中出现潜在的混乱

当我在一个raw中打开大约8个连接时,一切正常。几乎每次我查看这个数字时,它都会开始创建“服务器保持空闲连接”错误。以下是整个错误的示例:

Put:http:server已关闭空闲连接

以防万一,我尝试了一个连接,让它打开了一段时间,没有发送任何东西给它,它工作得很好。没有“空闲连接”错误。所以我很确定错误标签是错的。更可能是由于监听器过载而导致的错误(即,一行中的连接太多,连接管道已满)

我有两个主要问题:

  • 有没有办法解决客户端的问题?我试图调整连接的速度,但即使每次连接之间有1秒钟的睡眠(这太长了),我仍然会出错

  • 有没有办法设置localstack以允许在一行中发生更多连接?我用的是Docker版本

  • 对于(1),我看起来有点像MinIO,似乎没有任何方法来增加连接成功的超时时间,或者多次重复尝试,这将使我的生活更轻松

    对于(2),它需要匹配真正的S3环境所允许的。因此,如果localstack的现有设置已经与真正的S3匹配,恐怕我们需要使(1)工作


    下面是一个没有主代码失败那么严重的示例,但计数为28时,大多数情况下仍然失败。写入管道之前的数据长度或等待时间似乎不会影响将生成“空闲连接”错误的
    PutObject()
    。连接的数量(调用
    PutObject()
    )确实有很大的影响

    package main
    
    import (
        "fmt"
        "io"
        "os"
        "time"
    
        "github.com/minio/minio-go"
    )
    
    func main() {
        var mc *minio.Client
        var err error
        var size int64
        var count int = 28
        var outputRC []io.ReadCloser
        var inputPipe []*os.File
    
        mc, err = minio.New("192.168.2.95:4572", "localstack", "localstack", false)
        if err != nil {
            fmt.Printf("error: minio.New(): %v\n", err)
            os.Exit(1)
        }
    
        outputRC = make([]io.ReadCloser, count)
        inputPipe = make([]*os.File, count)
    
        // create pipes which are used to send data to the S3 objects
        for i := 0; i < count; i++ {
            // reader, writer, err = os.Pipe()
            outputRC[i], inputPipe[i], err = os.Pipe()
            if err != nil {
                fmt.Printf("error: os.Pipe() #%d: %v\n", i, err)
                os.Exit(1)
            }
        }
    
        // now setup the readers (read pipe output and save in S3 objects)
        for i := 0; i < count; i++ {
            time.Sleep(100 * time.Millisecond)
            idx := i
            go func() {
                filename := fmt.Sprintf("whatever-%d.mp3", idx)
                size, err = mc.PutObject("bucket-name", filename, outputRC[idx], -1, minio.PutObjectOptions{ContentType:"audio/mpeg"})
                if err != nil {
                    fmt.Printf("error: mc.PutObject() #%d: %v\n", idx, err)
                    //os.Exit(1)
                }
            }()
        }
    
        //time.Sleep(5 * time.Second)
    
        for i := 0; i < count; i++ {
            fmt.Fprintf(inputPipe[i], "FILE #%d\n", i)
        }
    
        //time.Sleep(10 * time.Second)
    
        for i := 0; i < count; i++ {
            inputPipe[i].Close()
        }
    
        time.Sleep(60 * time.Second)
    }
    
    主程序包
    进口(
    “fmt”
    “io”
    “操作系统”
    “时间”
    “github.com/minio/minio go”
    )
    func main(){
    var mc*小型客户端
    变量错误
    变量大小int64
    变量计数int=28
    var outputRC[]io.ReadCloser
    var inputPipe[]*os.File
    mc,err=minio.New(“192.168.2.95:4572”,“localstack”,“localstack”,false)
    如果错误!=零{
    fmt.Printf(“错误:minio.New():%v\n”,错误)
    操作系统退出(1)
    }
    outputRC=make([]io.ReadCloser,计数)
    inputPipe=make([]*os.File,计数)
    //创建用于向S3对象发送数据的管道
    对于i:=0;i
    什么是“服务器保持空闲连接”错误?您能告诉我您收到的确切错误,以及来自哪个电话吗?A会更好。@JimB好的,我添加了完整的错误消息和一个最小的示例。至于调用,则是带有链接
    PutObject()
    的调用。在内部,我可以想象它使用HTTP对象。根据我对该错误消息的发现,该消息将出现在
    net/http
    的Go实现中。当您提供正确的错误文本时,可以更容易地找到错误。如果您查看关于该错误的注释,它将解释可以返回该错误的情况,并在此处提供更多详细信息:。您正在使用的测试服务器可能有问题,可能是minio本身的问题,但是如果您正确地发送和关闭文件,您可能无能为力。