您提供的线程中的代码很棒,它似乎在管道工作流中从服务总线队列接收消息,接收完上一条消息后将接收下一条消息。
正如official site 在场景阶段的高吞吐量队列部分中提到的,我们可以找到以下适合您情况的点:
为了实现这些优化,我们可以利用sample on Azure github repo。
并最大化单个队列的吞吐量。我利用上面的示例代码进行了一个简单的测试,并将循环时间设置为 10 毫秒。
我的测试结果是:在ReceiveAndDelete模式下每秒会收到近50条消息;在 PeekLock 模式下每秒会收到大约 70 条消息,显示在https://azure.microsoft.com/en-us/documentation/articles/service-bus-nodejs-how-to-use-queues/#receive-messages-from-a-queue
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);
}
});