#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%.