获得;“服务器保持空闲连接”;使用MinIO和Go时出错当我连续打开多个连接时,如何解决此问题?
我有一个服务,它想打开28个到不同S3对象的连接,将它们保存在那里,以便以后重用 此时,我正在测试我的代码,以确保它能够正常工作,并避免在实际的S3环境中出现潜在的混乱 当我在一个raw中打开大约8个连接时,一切正常。几乎每次我查看这个数字时,它都会开始创建“服务器保持空闲连接”错误。以下是整个错误的示例: Put:http:server已关闭空闲连接 以防万一,我尝试了一个连接,让它打开了一段时间,没有发送任何东西给它,它工作得很好。没有“空闲连接”错误。所以我很确定错误标签是错的。更可能是由于监听器过载而导致的错误(即,一行中的连接太多,连接管道已满) 我有两个主要问题:获得;“服务器保持空闲连接”;使用MinIO和Go时出错当我连续打开多个连接时,如何解决此问题?,go,amazon-s3,minio,localstack,Go,Amazon S3,Minio,Localstack,我有一个服务,它想打开28个到不同S3对象的连接,将它们保存在那里,以便以后重用 此时,我正在测试我的代码,以确保它能够正常工作,并避免在实际的S3环境中出现潜在的混乱 当我在一个raw中打开大约8个连接时,一切正常。几乎每次我查看这个数字时,它都会开始创建“服务器保持空闲连接”错误。以下是整个错误的示例: Put:http:server已关闭空闲连接 以防万一,我尝试了一个连接,让它打开了一段时间,没有发送任何东西给它,它工作得很好。没有“空闲连接”错误。所以我很确定错误标签是错的。更可能是由
下面是一个没有主代码失败那么严重的示例,但计数为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本身的问题,但是如果您正确地发送和关闭文件,您可能无能为力。