Javascript Azure服务总线队列发送消息速度慢

Javascript Azure服务总线队列发送消息速度慢,javascript,node.js,azure,azure-servicebus-queues,Javascript,Node.js,Azure,Azure Servicebus Queues,因此,我正在尝试从node.js向Azure服务总线队列发送一条消息。我正在使用Azure文档中描述的样板代码 var message = { body: 'Test message', customProperties: { testproperty: 'TestValue' }}; serviceBusService.sendQueueMessage('myqueue', message, function(error){ if(!error){ // message sen

因此,我正在尝试从node.js向Azure服务总线队列发送一条消息。我正在使用Azure文档中描述的样板代码

var message = {
body: 'Test message',
customProperties: {
    testproperty: 'TestValue'
}};
serviceBusService.sendQueueMessage('myqueue', message, function(error){
if(!error){
    // message sent
}});
当我每隔几秒钟发送一条消息时,它工作正常,我可以看到我的工作人员在大约一秒钟后接收到该消息,但一旦我开始发送更多消息(每秒5-10条),它似乎开始阻塞,我看到性能下降到仅每5-8秒发送一条消息。有没有办法提高性能并保持FIFO顺序?由于我在本地运行节点代码和工作程序,这可能是延迟问题吗


注意:我使用的是基本的非分区队列。

为了优化服务总线的发送性能,如果您的应用程序支持异步发送和完成操作,我们可以利用客户端批处理。你可以得到官方文章的详细信息

然而,使用批处理发送消息的客户端只集成在.Net SDK中,在Node.js中,我们应该通过REST API实现自定义请求

要通过REST API实现自定义请求,我们需要首先在Azure portal上创建身份验证凭据:

  • 转到,在左侧菜单中选择 “服务巴士”
  • 选择您创建的名称空间
  • 在顶部菜单上选择队列
  • 选择要转到详细信息屏幕的队列
  • 转到“配置”选项卡并转到“共享访问策略”部分
  • 创建新策略,输入名称并选择“发送”权限以发送消息
  • 按页面底部的“保存”按钮保存
  • 转到“共享访问密钥生成器”部分
  • 选择策略并复制主键
  • 保存此密钥,以后将使用它
然后,您可以利用此代码示例生成用于发送批处理消息的SAS令牌

以下是代码片段:

var https = require('https');
var crypto = require('crypto');
// ServiceBus parameters
var namespace = '<Your-ServiceBus-Namespace>';
var queue ='<Your-Queue>';
var AccessKeyName = '<Your-AccessKey-Name>';
var AccessKey = '<Your-AccessKey>';
// Full ServiceBus Queue publisher URI

var ServiceBusUri = 'https://' + namespace + '.servicebus.windows.net' + '/' + queue;
function createSASToken(uri, keyName, key) {
                var expiry = parseInt(Date.now()/1000)+3600;
                var signedString = encodeURIComponent(uri) + '\n' + expiry;
                var hmac = crypto.createHmac('sha256', key);
                hmac.update(signedString);
                var signature = hmac.digest('base64');
                var token = 'SharedAccessSignature sr=' + encodeURIComponent(uri) + '&sig=' + encodeURIComponent(signature) + '&se=' + expiry + '&skn=' + keyName;

                return token;
}

var createdSASToken = createSASToken(ServiceBusUri, AccessKeyName, AccessKey);
var options = {
                hostname: namespace + '.' + 'servicebus.Windows.net',
                port: 443,
                path: '/' + queue + '/messages',
                method: 'POST',
                headers: {
                                'Authorization': createdSASToken,
                                'Content-Type': 'application/vnd.microsoft.servicebus.json',
                }
};
var req = https.request(options, function(res) {
                console.log("SendMessageInQueue:statusCode: ", res.statusCode);
                res.setEncoding('utf8');
                res.on('data', function(d) {
                });
});
req.on('error', function(e) {
                console.error(e);
});
var messages = [{
                "Body": "This is the first message"
}, {
                "Body": "This is the second message"
}, {
                "Body": "This is the third message"
}];
req.write(JSON.stringify(messages));
req.end();
var https=require('https');
var crypto=require('crypto');
//服务总线参数
var名称空间=“”;
变量队列=“”;
var AccessKeyName='';
var AccessKey='';
//完整ServiceBus队列发布器URI
var ServiceBusUri='https://'+命名空间+'.servicebus.windows.net'+'/'+队列;
函数createSASToken(uri、键名、键){
var expiry=parseInt(Date.now()/1000)+3600;
var signedString=encodeURIComponent(uri)+'\n'+到期日;
var hmac=crypto.createHmac('sha256',key);
hmac.update(signedString);
var签名=hmac.digest('base64');
var-token='sharedaccessignaturesr='+encodeURIComponent(uri)+'&sig='+encodeURIComponent(signature)+'&se='+expiry+'&skn='+keyName;
返回令牌;
}
var createdSASToken=createSASToken(ServiceBusUri、AccessKeyName、AccessKey);
变量选项={
主机名:命名空间+'.+'servicebus.Windows.net',
港口:443,
路径:'/'+队列+'/消息',
方法:“POST”,
标题:{
“授权”:createdSASToken,
“内容类型”:“application/vnd.microsoft.servicebus.json”,
}
};
var req=https.request(选项、函数(res){
log(“SendMessageInQueue:statusCode:”,res.statusCode);
res.setEncoding('utf8');
res.on('数据',功能(d){
});
});
请求开启('错误',功能(e){
控制台错误(e);
});
变量消息=[{
“正文”:“这是第一条消息”
}, {
“正文”:“这是第二条信息”
}, {
“正文”:“这是第三条信息”
}];
请求写入(JSON.stringify(消息));
请求结束();

此解决方案基于

请看,那里的共识是“不,他们不应该”!是否保留批处理消息顺序?如果是这样,我应该如何在JSON数组中对消息进行排序。索引0是从队列中出来的第一条消息还是最后一条消息?嗨@ToniKostelac,是的,它是有序的。在我的测试代码中,批处理消息的顺序类似于“first、second、thrid”。我收到信息的顺序仍然是“第一,第二,第三”