簡體   English   中英

帶有Node JS庫的Azure Service Bus隊列的最大吞吐量?

[英]Max throughput for Azure Service Bus Queue with Node JS library?

使用Azure NodeJS庫,我無法以每秒超過5或6條消息的速度接收來自Azure Service Bus隊列的消息。 這比官方文檔建議的要慢幾個數量級。 我正在使用關閉分區的隊列(如此處建議使用此處所示,使用Node.js從Azure WebJob輪詢Azure Service Bus隊列 ),以ReceiveAndDelete模式讀取。 本質上,我只是反復調用.receiveQueueMessage()。

基於這個問題( Azure服務總線可伸縮性 ),似乎其他人在使用NodeJS時也每秒看到5/6條消息。 這幾乎是一個硬性限制嗎? 任何已知的解決方法或優化?

您提供的線程中的代碼很棒,它似乎在管道工作流中從Service Bus Queue接收消息,該消息在接收完上一條消息后將接收下一條消息。

正如方案場景下“高吞吐量隊列”部分官方站點上所提到的,我們可以找到適合您情況的以下幾點:

  • 要提高隊列的總體接收率,請使用多個消息工廠來創建接收者。

  • 使用異步操作來利用客戶端批處理。

  • 將批處理間隔設置為50ms,以減少服務總線客戶端協議傳輸的次數。 如果使用多個發件人,則將批處理間隔增加到100ms。

為了實現這些優化,我們可以利用Azure github repo上示例

並最大化單個隊列的吞吐量。 我使用上面的示例代碼進行了簡單的測試,並將循環時間設置為10ms。 我測試的結果是:在ReceiveAndDelete模式下,它將每秒接收近50條消息; 並在PeekLock模式下每秒收到約70條消息,如https://azure.microsoft.com/en-us/documentation/articles/service-bus-nodejs-how-to-use-queues/#receive-隊列中的消息

var uuid = require('node-uuid');
var azure = require('azure');
var serviceBus = azure.createServiceBusService(connectionString);

function checkForMessages(sbService, queueName, callback) {
  sbService.receiveQueueMessage(queueName,{ isPeekLock: true }, function (err, lockedMessage) {

    if (err) {
      if (err === 'No messages to receive') {
        console.log('No messages');
      } else {
        callback(err);
      }
    } else {
      callback(null, lockedMessage);
    }
  });
}

function processMessage(sbService, err, lockedMsg) {
  if (err) {
    console.log('Error on Rx: ', err);
  } else {
    console.log('Rx: ', lockedMsg);
    sbService.deleteMessage(lockedMsg, function(err2) {
      if (err2) {
        console.log('Failed to delete message: ', err2);
      } else {
        console.log('Deleted message.');
      }
    })
  }
}

var idx = 0;
function sendMessages(serviceBus, queueName) {
  var msg = 'Message # ' + (++idx) + (' '+uuid.v4());
  serviceBus.sendQueueMessage(queueName, msg, function (err) {
   if (err) {
     console.log('Failed Tx: ', err);
   } else {
     console.log('Sent ' + msg);
   }
  });
}


var queueName = 'myqueue';
serviceBus.getQueue(queueName, function (err,res) {
  if (err) {
   console.log('Failed: ', err);
  } else {
  console.log('current msg count '+ res.MessageCount);
   // var t = setInterval(checkForMessages.bind(null, serviceBus, queueName,function(err, lockedMsg){}), 10);  //ReceiveAndDelete mode
   var t = setInterval(checkForMessages.bind(null, serviceBus, queueName, processMessage.bind(null, serviceBus)), 10);  // PeekLock mode
   // setInterval(sendMessages.bind(null, serviceBus, queueName), 100);
                setTimeout(function(){
                                clearInterval(t);
                                console.log('task over');
                   },1000);
  }
}); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM