Как мне убедиться, что все мои сообщения будут получены с помощью очереди служебной шины Azure?

#azure #azureservicebus #servicebus #azure-servicebus-queues

#azure #azureservicebus #servicebus #azure-servicebus-queues

Вопрос:

Я создал очередь служебной шины, следуя руководству в Документации Microsoft. Я могу отправлять и получать сообщения, однако только половина моих сообщений проходит. Буквально половина, только четные.

Я пытался изменить частоту сообщений, но это ничего не меняет. Не имеет значения, отправляю ли я сообщение каждые 3 секунды или 3 сообщения в секунду, я получаю только половину из них на другом конце.

Я запустил пример кода на всех возможных языках и пытался использовать REST API и пакетную передачу сообщений, но безрезультатно.

Я также пытался использовать функции Azure с определенным триггером для очередей служебной шины.

Это код функции получения:

 module.exports = async function(context, mySbMsg) {
  context.log('JavaScript ServiceBus queue trigger function processed message', mySbMsg);
  context.done();
};
  

И это код функции отправки:

 module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    var azure = require('azure-sb');

    var idx = 0;
    function sendMessages(sbService, queueName) {
      var msg = 'Message # '   (  idx);
      sbService.sendQueueMessage(queueName, msg, function (err) {
       if (err) {
         console.log('Failed Tx: ', err);
       } else {
         console.log('Sent '   msg);
       }
      });
    }

    var connStr = 'Endpoint=sb://<sbnamespace>.servicebus.windows.net/;SharedAccessKeyName=<keyname>;SharedAccessKey=<key>';
    var queueName = 'MessageQueue';

    context.log('Connecting to '   connStr   ' queue '   queueName);
    var sbService = azure.createServiceBusService(connStr);
    sbService.createQueueIfNotExists(queueName, function (err) {
      if (err) {
       console.log('Failed to create queue: ', err);
      } else {
       setInterval(sendMessages.bind(null, sbService, queueName), 2000);
      }
    });
};
  

Я ожидаю получить большую часть отправленных сообщений (особенно в условиях полного отсутствия нагрузки), но вместо этого я получаю только 50%.

Комментарии:

1. Можете ли вы проверить, действительно ли отправляемые вами сообщения попадают в очередь служебной шины? Для проверки просто удалите получателя и отправьте фиксированное количество сообщений в очередь и проверьте количество сообщений. Также, пожалуйста, проверьте, настроена ли очередь на автоматическое удаление сообщений через определенный промежуток времени.

2. Я перешел на другую подписку, и все начало работать безупречно. Тот же сценарий развертывания, тот же код функций. Я не знаю, что вызвало проблему.

Ответ №1:

Я предполагаю, что причина в том, что вы прослушиваете только одну из 2 подписок по теме, и она настроена на разделение сообщений между подписками. Эта функция используется для разделения рабочей нагрузки на несколько служб. Вы можете прочитать о темах здесь:https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-overview и https://learn.microsoft.com/en-us/azure/service-bus-messaging/topic-filters

Вот описание сортировки по ссылкам выше: «Разделение использует фильтры для распределения сообщений по нескольким существующим подпискам на темы предсказуемым и взаимоисключающим образом. Шаблон разделения используется, когда система масштабируется для обработки множества различных контекстов в функционально идентичных ячейках, каждая из которых содержит подмножество общих данных; например, информацию профиля клиента. При разделении издатель отправляет сообщение в раздел, не требуя каких-либо знаний о модели разделения. Затем сообщение перемещается в правильную подписку, из которой оно затем может быть извлечено обработчиком сообщений раздела.»

Чтобы проверить это, вы можете посмотреть, включено ли в вашей служебной шине разделение или какие-либо другие фильтры.Я думаю, что отключение разделения должно сработать в вашем случае.

Комментарии:

1. В вопросе упоминаются очереди служебной шины, а не темы и подписки.

2. Это помогло мне устранить мою проблему. У меня (случайно) было два слушателя подписки на одну и ту же тему, и Azure, похоже, распределял сообщения между этими двумя. Один слушатель получал только каждое второе сообщение, так что 50%.