Azure 服务总线队列发送消息缓慢
Azure Service Bus Queues slow to send message
所以我正在尝试从 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 顺序?这可能是延迟问题,因为我是 运行 我的节点代码和本地工作人员?
注意:我使用的是基本的非分区队列。
要优化服务总线的发送性能,如果您的应用程序支持异步发送和完成操作,我们可以利用客户端批处理。详情可参考官方文章https://azure.microsoft.com/en-us/documentation/articles/service-bus-performance-improvements/#client-side-batching.
但是客户端使用batch发送消息只集成在.Net SDK中,在Node.js中我们应该通过REST实现自定义请求API https://msdn.microsoft.com/en-us/library/azure/dn798894.aspx.
要通过 REST API 实现自定义请求,我们需要先在 Azure 门户上创建身份验证凭据:
- 转到 Azure Managment Portal,在左侧菜单中 select
"SERVICE BUS".
- Select 您创建的命名空间。
- 在顶部菜单上 select 队列。
- Select 进入详情页面的 QUEUE
- 转到“配置”选项卡并转到 "Shared access policies"
部分
- 创建新策略,输入名称和select发送消息的"Send"权限
- 按页面底部的“保存”按钮保存
- 转到第 "Shared access key generator"
部分
- Select 您的保单并复制 PRIMARY KEY
- 保存这个密钥,稍后你会用到它
然后您可以利用此代码示例生成用于发送批处理消息的 SAS 令牌,https://github.com/dx-ted-emea/azure-tessel/blob/master/labs/service-bus-queues/CreateSASToken.js
这是代码片段:
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。
所以我正在尝试从 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 顺序?这可能是延迟问题,因为我是 运行 我的节点代码和本地工作人员?
注意:我使用的是基本的非分区队列。
要优化服务总线的发送性能,如果您的应用程序支持异步发送和完成操作,我们可以利用客户端批处理。详情可参考官方文章https://azure.microsoft.com/en-us/documentation/articles/service-bus-performance-improvements/#client-side-batching.
但是客户端使用batch发送消息只集成在.Net SDK中,在Node.js中我们应该通过REST实现自定义请求API https://msdn.microsoft.com/en-us/library/azure/dn798894.aspx.
要通过 REST API 实现自定义请求,我们需要先在 Azure 门户上创建身份验证凭据:
- 转到 Azure Managment Portal,在左侧菜单中 select "SERVICE BUS".
- Select 您创建的命名空间。
- 在顶部菜单上 select 队列。
- Select 进入详情页面的 QUEUE
- 转到“配置”选项卡并转到 "Shared access policies" 部分
- 创建新策略,输入名称和select发送消息的"Send"权限
- 按页面底部的“保存”按钮保存
- 转到第 "Shared access key generator" 部分
- Select 您的保单并复制 PRIMARY KEY
- 保存这个密钥,稍后你会用到它
然后您可以利用此代码示例生成用于发送批处理消息的 SAS 令牌,https://github.com/dx-ted-emea/azure-tessel/blob/master/labs/service-bus-queues/CreateSASToken.js
这是代码片段:
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。