[英]Put message in dead letter queue in azure service bus from node js client
[英]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.