2017-10-19 135 views
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)); 
} 

它發送消息並立即開始試圖每毫秒接收一條消息。一旦收到,它就會計算出時間。這不應該花費更少的時間嗎?

+0

我寫了一個從SQS讀取並存儲在MySQL數據庫中的「隊列抽取器」工具......它內置了一些巧妙的東西,比如在獲取下一批時異步刪除上一批,但它仍然有一些可以完成的優化,我忘記了具體的數字...但我幾乎肯定它可以消耗每秒接近200條消息......所以你的時間似乎有點關閉,有點當然有10條消息在隊列中而不是1,你會有顯着的trx/sec改進。你在哪裏運行這段代碼?在EC2中與隊列相同的地區,還是其他地方? –

+0

我並不十分關心它每秒能處理多少條消息。我更關心單個消息的往返時間。另外,我從我的本地系統運行這個。 – Matt

+1

從您的本地系統運行將帶來嚴重的延遲,因爲您正在通過TLS向服務發送HTTP,因此會有多次開銷。每秒提及消息的重點不在於服務的速度 - 它要快得多 - 關鍵是如果我每秒處理超過100條消息,那麼我必須在10ms內處理每條消息。我只有一個線程在運行。如果我將消息的最大數量設置爲1,我仍然通過約20條消息/秒或約50ms來消除。時間從冷啓動只做1,沒有什麼顯示。 –

回答

2

你會使用任何隊列的原因不是爲了性能,而是爲了恢復力。

隊列解決了很多問題,它們提供了斷開連接的系統之間的異步通信,它們允許您真正擴展系統,並提供增強的彈性,確保消息在系統故障時不會「丟失」。

在處理隊列時,您應該考慮圍繞eventual consistency的概念設計您的系統,這意味着您的消息最終會到達並處理,但可能不會在您希望的順序或甚至按照您的預期順序處理。

功能,例如速度,排序,重試等,將隊列實現(SQS,卡夫卡的RabbitMQ等)

之間。如果您正在尋找超高IOPS那麼或許隊列是不是你想要的改變。