2015-12-10 5 views
0

Итак, я пытаюсь отправить сообщение в очередь шины Azure Service из 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? Может ли это быть проблемой задержки, так как я запускаю свой код узла и мой рабочий локально?

ПРИМЕЧАНИЕ. Я использую базовые несегментированные очереди.

+0

См. [«Если вопросы включают« теги »в их названиях?»] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), где консенсус «нет, они не должны»! –

ответ

1

Для оптимизации загрузки служебной шины мы можем использовать пакетную обработку на стороне клиента, если ваше приложение поддерживает асинхронные операции отправки и завершения. Вы можете получить подробную информацию о официальной статье https://azure.microsoft.com/en-us/documentation/articles/service-bus-performance-improvements/#client-side-batching.

Однако клиент, использующий пакет для отправки сообщений, интегрирован только в .Net SDK, в Node.js мы должны внедрять пользовательские запросы через REST API https://msdn.microsoft.com/en-us/library/azure/dn798894.aspx.

Для реализации пользовательских запросов через REST API, нам нужно создать учетные данные аутентификации первой на Лазурном портале:

  • Перейти к Azure Managment Portal, в меню слева выберите «SERVICE BUS».
  • Выберите пространство имен, которое вы создали.
  • В верхнем меню выберите QUEUES.
  • Выберите ОЧЕРЕДЬ, чтобы перейти к подробностям экрана
  • Перейдите на вкладку CONFIGURE и перейдите в раздел «Общие правила доступа»
  • Создать новую политику, введите имя и выберите разрешение «Отправить» для отправки сообщения
  • сохранить его, нажав на кнопку SAVE в нижней части страницы
  • Перейти в раздел «Общий доступ генератора ключ»
  • Выберите политику и скопировать на первичный ключ
  • Сохранить эту кнопку, вы будете используйте его позже

Затем вы можете использовать этот образец кода для создания 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.

+0

будет сохранен порядок сообщений партии? если да, то как мне заказывать сообщения в массиве JSON. Является ли индекс 0 первым сообщением, выходящим из очереди или последней? –

+1

Привет @ToniKostelac, Да, это приказано. В моем тестовом коде пакетные сообщения имеют порядок «первый, второй, thrid». И порядок, в котором я получаю сообщения, по-прежнему находится в «первом, втором, –