如何确保通过Azure Service Bus Queue接收所有消息?

时间:2019-03-26 11:03:43

标签: azure azureservicebus servicebus azure-servicebus-queues

我按照Microsoft Documentation中的教程创建了服务总线队列。我可以发送和接收消息,但是只有一半的消息可以通过。从字面上看,只有一半。

我尝试更改消息频率,但没有任何改变。每3秒发送一次消息或每秒发送3条消息都没有关系,另一端只收到一半。

我已使用所有可能的语言运行示例代码,并且尝试使用REST API和批处理消息传递,但没有骰子。

我还尝试将Azure Functions与特定的触发器用于Service Bus队列。

这是接收功能代码:

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 :(得分:0)

我的猜测是,原因是您仅听有关该主题的2个订阅之一,并且将其设置为在订阅之间拆分消息。此功能用于将工作负载拆分为多个服务。您可以在这里阅读有关主题的信息:https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-overviewhttps://docs.microsoft.com/en-us/azure/service-bus-messaging/topic-filters

这里是以上链接的排序说明: “分区使用过滤器以可预测的且互斥的方式在多个现有主题订阅之间分配消息。当系统被扩展为在功能相同的隔离专区中处理许多不同的上下文时,使用分区模式,每个隔离专区均包含全部数据的子集;例如,客户档案信息。通过分区,发布者将邮件提交到主题中,而无需任何分区模型知识。然后,邮件被移到正确的订阅中,分区的消息处理程序可以从中检索该消息。”

要进行检查,您可以查看您的服务总线是否已打开分区或其他任何过滤器。关闭分区应该可以解决您的问题。