首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure服务总线队列发送消息慢

Azure服务总线队列发送消息慢
EN

Stack Overflow用户
提问于 2015-12-10 14:53:53
回答 1查看 3.1K关注 0票数 1

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

代码语言:javascript
复制
var message = {
body: 'Test message',
customProperties: {
    testproperty: 'TestValue'
}};
serviceBusService.sendQueueMessage('myqueue', message, function(error){
if(!error){
    // message sent
}});

当我每隔几秒钟发送一条消息时,它就能正常工作,我可以看到消息在大约一秒钟后被我的工作人员接收到,但是一旦我开始发送更多的消息(每秒5-10条),它看起来就会开始窒息,我看到性能下降到每5-8秒只发送一条消息。有没有任何方法来提高性能和保持FIFO的顺序?这是否是一个延迟问题,因为我正在本地运行我的节点代码和我的员工?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-11 09:21:44

为了优化服务总线的发送性能,如果您的应用程序支持异步发送和完成操作,我们可以利用客户端批处理。您可以获得关于官方文章https://azure.microsoft.com/en-us/documentation/articles/service-bus-performance-improvements/#client-side-batching的详细信息。

然而,使用批处理发送消息的客户端只集成在.Net SDK中,在Node.js中我们应该通过REST https://msdn.microsoft.com/en-us/library/azure/dn798894.aspx实现自定义请求。

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

  • 转到Azure管理门户,在左边的菜单中选择“服务总线”。
  • 选择您创建的名称空间。
  • 在顶部菜单上选择队列。
  • 选择要进入详细信息屏幕的队列
  • 转到“配置”选项卡,转到“共享访问策略”部分。
  • 创建新策略,输入名称并选择发送消息的“发送”权限
  • 按下页面底部的“保存”按钮保存它。
  • 转到“共享访问密钥生成器”部分
  • 选择策略并复制主键
  • 保存此密钥,您稍后将使用它。

然后,可以利用此代码示例生成用于发送批处理消息的SAS令牌,即https://github.com/dx-ted-emea/azure-tessel/blob/master/labs/service-bus-queues/CreateSASToken.js

下面是代码片段:

代码语言:javascript
复制
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();

该解决方案基于https://github.com/dx-ted-emea/azure-tessel/tree/master/labs/service-bus-queues

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34204996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档