使用 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
首先 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