gpt4 book ai didi

amazon-web-services - 如果收到消息,AWS SQS 长轮询是否会提前返回?

转载 作者:行者123 更新时间:2023-12-05 03:48:56 31 4
gpt4 key购买 nike

如果我使用 SQS 长轮询并将“WaitTimeSeconds”设置为 10 秒并将“MaxNumberOfMessages”设置为 1,并且在 0.1 秒后将单个消息传递到队列,对 sqs.receiveMessage() 的调用是否会返回在那一点上立即返回,还是应该在“WaitTimeSeconds”的 10 秒过去后才返回?

在我的测试中,对 sqs.receiveMessage() 的调用似乎要等到“WaitTimeSeconds”的整个持续时间结束后才会返回。

代码如下:

// Load the AWS SDK for Node.js
var AWS = require("aws-sdk");

const fmReqQ = "https://sqs.ap-southeast-2.amazonaws.com/myactid/fmReqQ";
const fmRspQ = "https://sqs.ap-southeast-2.amazonaws.com/myactid/fmRspQ";

const SydneyRegion = "ap-southeast-2";

var credentials = new AWS.SharedIniFileCredentials({ profile: "myprofile" });
AWS.config.credentials = credentials;

// Set the region
AWS.config.update({ region: SydneyRegion });

// Create an SQS service object
var sqs = new AWS.SQS({ apiVersion: "2012-11-05" });

async function sendRequest() {
var sendParams = {
MessageBody: "Information of 12/11/2016.",
QueueUrl: fmReqQ,
};

try {
data = await sqs.sendMessage(sendParams).promise();
console.log("Success, request MessageId: ", data.MessageId);
} catch (err) {
console.log("Error", err);
}
}

async function doModelling() {
console.time("modelling");
await sendRequest();
await receiveResponse();
console.timeEnd("modelling");
}

async function receiveResponse() {
var receiveParams = {
AttributeNames: ["SentTimestamp"],
MaxNumberOfMessages: 1,
MessageAttributeNames: ["All"],
QueueUrl: fmRspQ,
WaitTimeSeconds: 1,
};

let data = null;
try {
data = await sqs.receiveMessage(receiveParams).promise();
console.log("Success, response MessageId: ", data);
} catch (err) {
console.log("Error", err);
}
}

doModelling();

当我设置“WaitTimeSeconds: 3”时,我得到输出:

Success, request MessageId:  e5079c2a-050f-4681-aa8c-77b05ac7da7f
Success, response MessageId: {
ResponseMetadata: { RequestId: '1b4d6a6b-eaa2-59ea-a2c3-3d9b6fadbb3f' }
}
modelling: 3.268s

当我设置“WaitTimeSeconds: 10”时,我得到输出:

Success, request MessageId:  bbf0a429-b2f7-46f2-b9dd-38833b0c462a
Success, response MessageId: {
ResponseMetadata: { RequestId: '64bded2d-5398-5ca2-86f8-baddd6d4300a' }
}
modelling: 10.324s

注意经过的持续时间如何与 WaitTimeSeconds 匹配。

来自 reading about AWS SQS long polling它说它长轮询“消息可用后立即返回消息。”

我似乎没有看到消息“一旦可用”,我似乎注意到 sqs.receiveMessage() 调用总是占用 WaitTimeSeconds 中设置的持续时间。

如您在示例代码中所见,我已将 MaxNumberOfMessage 设置为 1。

最佳答案

ReceiveMessage()长轮询一起使用将在队列中至少有一条消息时立即返回

我不是 Node 用户,但我是这样测试它的:

  • 创建了一个 Amazon SQS 队列
  • 在一个窗口中,我运行了:
aws sqs receive-message --queue-url https://sqs.ap-southeast-2.amazonaws.com/123/foo --visibility-timeout 1 --wait-time-seconds 10
  • 然后,在另一个窗口中,我运行:
aws sqs send-message --queue-url https://sqs.ap-southeast-2.amazonaws.com/123/foo --message-body bar

receive-message 命令在我使用send-message 命令后很快返回。

您的测试可能会受到“已接收”但标记为“不可见”的消息的影响,并且由于您的代码未调用 DeleteMessage(),因此在以后的测试中保持不可见状态。我通过特别声明 --visibility-timeout 1 避免了这种情况,这使得消息立即重新出现在下一次测试的队列中。

请求的消息数 (--max-number-of-messages) 不会影响此结果。只要至少有一条消息可用,它就会返回。

关于amazon-web-services - 如果收到消息,AWS SQS 长轮询是否会提前返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64165244/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com