我遇到了问题。我正在尝试使用具有两个长轮询nodeJS实例的单个SQS队列。我面临的问题是,当我将新消息放入队列时,BOTH实例立即拉出相同的消息。有没有办法防止这种行为?我的目标是最终拥有一个NodeJS处理场,每个实例将从队列中提取一条唯一的消息并执行处理。
以下是我的SQS监听器的代码:
console.log("Checking SQS Queue");
return new Promise((resolve,reject) => {
let sqs = new aws.SQS();
let params = {
AttributeNames: [
"SentTimeStamp"
],
MaxNumberOfMessages: 1,
MessageAttributeNames: [
"All"
],
QueueUrl: SQS_URL,
WaitTimeSeconds: 20,
VisibilityTimeout: 0
};
sqs.receiveMessage(params, (err, data) => {
if(err){
console.log("Error: ",err);
reject(err);
} else if (data.Messages) {
resolve(data);
}
resolve(data);
});
});
答案 0 :(得分:3)
您需要设置更高的VisibilityTimeout,至少需要处理消息所需的时间,然后在一个实例从SQS读取消息到VisibilityTimeout值之后,其他实例将无法看到它。
请检查您在创建队列时为队列设置的VisibilityTimeout。