Amazon web services SQS消息在队列中空闲达99秒,直到readMessage拾取它

Amazon web services SQS消息在队列中空闲达99秒,直到readMessage拾取它,amazon-web-services,go,aws-sdk,amazon-sqs,aws-sdk-go,Amazon Web Services,Go,Aws Sdk,Amazon Sqs,Aws Sdk Go,我有一个从s3转换文件的ETL过程。 S3事件通知向SQS发送消息,fargate任务轮询队列中的消息。我的问题是消息在一段可变的时间内没有被接收到,最长可达99秒 我每2秒钟就要找一次信息。我可以通过控制台确认消息在队列中,但它有一段时间没有被读取。此外,我还在日志中打印消息在队列中的延迟,基于MessageSystemAttributeNameApproximateReceiveCount和MessageSystemAttributeNameSentTimestamp之间的差异 queueU

我有一个从s3转换文件的ETL过程。 S3事件通知向SQS发送消息,fargate任务轮询队列中的消息。我的问题是消息在一段可变的时间内没有被接收到,最长可达99秒

我每2秒钟就要找一次信息。我可以通过控制台确认消息在队列中,但它有一段时间没有被读取。此外,我还在日志中打印消息在队列中的延迟,基于MessageSystemAttributeNameApproximateReceiveCount和MessageSystemAttributeNameSentTimestamp之间的差异

queueURL:=os.Getenv(“队列URL”)
csvBucket:=os.Getenv(“CSV\u BUCKET\u NAME”)
sess,u:=session.NewSession()
//TODO:检查并处理错误
svc:=sqs.New(sess)
为了{
时间.睡眠(时间.持续时间(2)*时间.秒)
msgResult,err:=svc.ReceiveMessage(&sqs.ReceiveMessageInput){
AttributeName:[]*字符串{
aws.String(sqs.MessageTributenNameSenderId),
aws.String(sqs.MessageSystemAttributeNameSentTimestamp),
aws.String(sqs.MessageSystemAttributeNameApproximateReceiveCount),
aws.String(sqs.MessageSystemAttributeNameApproximateFirstReceiveTimestamp),
aws.String(sqs.MessageTributenNameSequenceNumber),
aws.String(sqs.MessageSystemAttributeNameMessageDeduplicationId),
aws.String(sqs.MessageSystemAttributeNameMessageGroupId),
aws.String(sqs.MessageSystemAttributeNameAstraceHeader),
},
MessageAttributeName:[]*字符串{
aws.String(sqs.QueueAttributeNameAll),
},
QueueUrl:aws.String(QueueUrl),
MaxNumberOfMessages:aws.Int64(10),
可见性超时:aws.Int64(30),//60秒
WaitTimeSeconds:aws.Int64(0),
})
如果错误!=零{
log.Printf(“接收消息失败:%v”,错误)
返回
}
如果len(msgResult.Messages)==0{
持续
}
//TODO:处理所有结果
//fmt.Printf(“成功:%+v\n”,msgResult.Messages)
log.Printf(“消息量%v”,len(msgResult.messages))
i、 错误:=strconv.ParseInt(*msgResult.Messages[0]。属性[“ApproximateFirstReceiveTimestamp”],10,64)
如果错误!=零{
log.Printf(“未能分析int:%v”,错误)
返回
}
tm1:=time.Unix(0,i*int64(1000000))
ii,err:=strconv.ParseInt(*msgResult.Messages[0]。属性[“SentTimestamp”],10,64)
如果错误!=零{
恐慌(错误)
}
tm2:=time.Unix(0,ii*int64(1000000))
/*从s3下载一些代码并上传到另一个bucket*/
_,err=svc.DeleteMessage(&sqs.DeleteMessageInput){
QueueUrl:aws.String(QueueUrl),
ReceiptHandle:msgResult.Messages[0]。ReceiptHandle,
})
如果错误!=零{
log.Println(“删除失败”)
持续
}
log.Println(“消息删除成功”)
}
我完全不知道自己做错了什么,然后我上传到另一个bucket到一个队列中,它被lambda接收,这通常在大约一秒钟内完成

定义管道的cdk代码

super(范围、id)
const dlq=新的sqs.Queue(这是“死信队列”{
保留期:cdk.期限.天(14),
});
const q=新的sqs.Queue(这是“ProcessingQueue”{
死信队列:{
队列:dlq,,
maxReceiveCount:3,
},
});
const queueFargate=new ecsPatterns.QueueProcessingFargateService(此“服务”{
队列:q,
vpc:props.vpc,
memoryLimitMiB:512,
中央处理器:256,
图像:ecs.ContainerImage.fromAsset('services/convert'),
平台版本:ecs.FargatePlatformVersion.VERSION1_4,
所需数量:1,
环境:{
队列URL:q.queueUrl,
CSV_BUCKET_NAME:props.convertBucket.bucketName,
},
});
props.uploadBucket.addEventNotification(s3.EventType.OBJECT_已创建,新的s3n.SQS目标(queueFargate.sqsQueue))
props.uploadBucket.grantrade(queueFargate.service.taskDefinition.taskRole)
props.convertBucket.grantWrite(queueFargate.service.taskDefinition.taskRole)
AWS SDK for Go的版本?

github.com/aws/aws-sdk-go v1.34.6

去1.14

预期行为


消息在队列中时应立即读取。

这可能是使用短轮询而不是长轮询的结果。根据AWS文件,关于:

通过短轮询,ReceiveMessage请求仅查询服务器的子集(基于加权随机分布),以查找可包含在响应中的消息。AmazonSQS立即发送响应,即使查询没有发现任何消息

另一方面,长轮询将:

通过查询所有而不是AmazonSQS服务器的子集来减少假空响应

通过为
WaitTimeSeconds
传递一个非零值,并在每次迭代中删除两秒睡眠,可以在代码中实现长轮询

timestamp,message
1599145270790,2020/09/03 15:01:10 seconds the message was unprocessed in the queue: 0.909
1599145426542,2020/09/03 15:03:46 seconds the message was unprocessed in the queue: 19.835
1599145472884,2020/09/03 15:04:32 seconds the message was unprocessed in the queue: 4.721
1599145611897,2020/09/03 15:06:51 seconds the message was unprocessed in the queue: 24.793
1599145720293,2020/09/03 15:08:40 seconds the message was unprocessed in the queue: 40.296
1599145930662,2020/09/03 15:12:10 seconds the message was unprocessed in the queue: 66.736
1599145997155,2020/09/03 15:13:17 seconds the message was unprocessed in the queue: 10.961
1599146249316,2020/09/03 15:17:29 seconds the message was unprocessed in the queue: 99.084
1599146319998,2020/09/03 15:18:39 seconds the message was unprocessed in the queue: 35.015
1599146361620,2020/09/03 15:19:21 seconds the message was unprocessed in the queue: 17.353
1599146438448,2020/09/03 15:20:38 seconds the message was unprocessed in the queue: 45.878