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,沒有什麼顯示。 –