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

Using Golang to Read From Amazon-SQS Queue - Open File Descriptors

首先 post,请耐心等待 - 我正在使用 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

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

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,
        },
    },
}

所以 - 这里有两个组件要解决:

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

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

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