首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Golang从Amazon-SQS队列读取-打开文件描述符

使用Golang从Amazon-SQS队列读取-打开文件描述符
EN

Stack Overflow用户
提问于 2020-12-04 06:21:32
回答 2查看 496关注 0票数 0

第一篇文章,所以请耐心听我说--我正在使用ReceiveMessage从Amazon-SQS队列中读取内容--下面是代码片段。这一切都运行得很好(到目前为止,每分钟运行大约3000条消息)。然而,一个lsof -p显示了很多(在某些时候是数百个)打开的文件描述符-这是预期的吗?或者需要做些什么来关闭未使用的连接(如果这是正确的术语)。任何建议都将不胜感激。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-04 23:11:42

您可以通过在aws.Config客户端中设置MaxConnsPerHost来控制连接数

代码语言:javascript
复制
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,
        },
    },
}
票数 0
EN

Stack Overflow用户

发布于 2020-12-08 09:01:05

因此,这里有两个组件需要解决:

1-从提供的ganapathydselva中适当地应用上述内容。

2-确保适当地调整了文件描述符。由于我的应用程序是从systemd运行的,因此我在.service文件LimitNOFILE=8192:10240的服务部分下面应用了以下内容

这会将软限制提高到8192,将硬限制提高到10240

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65135052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档