0
我一直在测试发送消息并从SQS队列接收消息所花费的时间。它需要平均800-1200毫秒,这似乎是一个荒谬的很长一段时间。这里是我的测试代码,请告诉我,如果我做错了什么。为什么AWS SQS如此之慢?
var t0;
sendMessage('hello');
function sendMessage(message){
var params = {
MessageBody: message,
QueueUrl: queueUrl
};
t0 = now();
sqs.sendMessage(params, function(err,data){
if(err){
throw err;
} else {
console.log("Message Send Confirmation");
}
});
unbatch();
}
async function unbatch(){
var params = {
QueueUrl: queueUrl,
MaxNumberOfMessages: 10
};
var go = true;
while(go){
console.log("Polling...");
sqs.receiveMessage(params, function(err, data){
if(data.Messages){
console.log("Message Received");
console.log("Total Time: " + ((now() - t0)/1000));
go = false;
var deleteParams = {
QueueUrl: queueUrl,
ReceiptHandle: data.Messages[0].ReceiptHandle
};
sqs.deleteMessage(deleteParams, function(err, data) {
if (err) {
console.log("Delete Error", err);
} else {
console.log("Message Deleted");
}
});
}
});
await sleep(1);
}
}
function sleep(ms){
return new Promise(resolve => setTimeout(resolve, ms));
}
它发送消息并立即开始试图每毫秒接收一条消息。一旦收到,它就会计算出时间。这不应该花费更少的时间吗?
我写了一个从SQS读取并存储在MySQL数据库中的“队列抽取器”工具......它内置了一些巧妙的东西,比如在获取下一批时异步删除上一批,但它仍然有一些可以完成的优化,我忘记了具体的数字...但我几乎肯定它可以消耗每秒接近200条消息......所以你的时间似乎有点关闭,有点当然有10条消息在队列中而不是1,你会有显着的trx/sec改进。你在哪里运行这段代码?在EC2中与队列相同的地区,还是其他地方? –
我并不十分关心它每秒能处理多少条消息。我更关心单个消息的往返时间。另外,我从我的本地系统运行这个。 – Matt
从您的本地系统运行将带来严重的延迟,因为您正在通过TLS向服务发送HTTP,因此会有多次开销。每秒提及消息的重点不在于服务的速度 - 它要快得多 - 关键是如果我每秒处理超过100条消息,那么我必须在10ms内处理每条消息。我只有一个线程在运行。如果我将消息的最大数量设置为1,我仍然通过约20条消息/秒或约50ms来消除。时间从冷启动只做1,没有什么显示。 –