Как мне убедиться, что я получаю все свои сообщения с помощью Azure Service Bus Queue? - PullRequest
0 голосов
/ 26 марта 2019

Я создал очередь служебной шины, следуя инструкциям в Документация 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 Ответ

0 голосов
/ 26 марта 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...