第一篇文章,所以请耐心听我说--我正在使用ReceiveMessage从Amazon-SQS队列中读取内容--下面是代码片段。这一切都运行得很好(到目前为止,每分钟运行大约3000条消息)。然而,一个lsof -p显示了很多(在某些时候是数百个)打开的文件描述符-这是预期的吗?或者需要做些什么来关闭未使用的连接(如果这是正确的术语)。任何建议都将不胜感激。
for {
select {
default:
recvResult, rErr := c.AwsService.ReceiveMessage(&sqs.ReceiveMessageInput{
QueueUrl: c.AwsQueueURL.QueueUrl,
MaxNumberOfMessages: aws.Int64(c.AwsMaxMessages),
WaitTimeSeconds: aws.Int64(c.AwsLongPollTimeout),
VisibilityTimeout: aws.Int64(c.AwsVisibilityTimeout),
})
// error check
var wg sync.WaitGroup
msgCount := len(recvResult.Messages)
if msgCount > 0 {
for _, awsMsg := range recvResult.Messages {
wg.Add(1)
go func(m *sqs.Message) {
defer wg.Done()
// process message body, send results to another endpoint, not AWS
okToDelete := processAwsMessage(
workerId, c.NodeId, c.QueueId, c.SaveMessageOnError,
time.Now().UnixNano(), m.Body,
)
if okToDelete {
_, dErr := c.AwsService.DeleteMessage(
&sqs.DeleteMessageInput{
QueueUrl: c.AwsQueueURL.QueueUrl,
ReceiptHandle: m.ReceiptHandle,
})
// error check
}
}(awsMsg) // End go func
} end for messages
wg.Wait()
} // end msgCount > 0
//// Code to complete select (ctx.Done) and for, etc发布于 2020-12-04 23:11:42
您可以通过在aws.Config客户端中设置MaxConnsPerHost来控制连接数
config := &aws.Config{
Endpoint: aws.String("sqs.us-east-1.amazonaws.com"), // VPC endpoint here
Region: aws.String("us-east-1"),
HTTPClient: &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyFromEnvironment,
DialContext: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}).DialContext,
MaxIdleConns: 380,
MaxIdleConnsPerHost: 160,
IdleConnTimeout: 90 * time.Second,
TLSHandshakeTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
},
},
}发布于 2020-12-08 09:01:05
因此,这里有两个组件需要解决:
1-从提供的ganapathydselva中适当地应用上述内容。
2-确保适当地调整了文件描述符。由于我的应用程序是从systemd运行的,因此我在.service文件LimitNOFILE=8192:10240的服务部分下面应用了以下内容
这会将软限制提高到8192,将硬限制提高到10240
https://stackoverflow.com/questions/65135052
复制相似问题