2017-01-13 92 views
0

我正在模拟Azure数据中心的故障以及服务总线在成对命名空间情况下处理插入的方式。当主名称空间无法访问时Azure服务总线:配对名称空间插入

ms docs指出:

失败时发送到主队列中,发送者开始发送 消息到一个随机选择的缓冲区队列

然而,我注意到队列客户端/消息发送者总是试图命中主命名空间,并且从不切换到次命名空间。

private MessagingFactory GetFactory(bool isReceiver = false) 
    { 
     var primaryConnectionString = PrimaryConnectionString(); 

     var secondaryConnectionString = SecondaryConnectionString();      

     var primaryFactory = 
      MessagingFactory.CreateFromConnectionString(primaryConnectionString); 

     var secondaryMessagingFactory = MessagingFactory.CreateFromConnectionString(secondaryConnectionString); 
     var secondaryNamespaceManager = NamespaceManager.CreateFromConnectionString(secondaryConnectionString); 

     var sendAvailabilityOptions = new SendAvailabilityPairedNamespaceOptions(secondaryNamespaceManager, 
      secondaryMessagingFactory, 1, TimeSpan.FromSeconds(5), isReceiver); 
     primaryFactory.PairNamespaceAsync(sendAvailabilityOptions).Wait(); 

     return primaryFactory; 
    } 

和发送测试消息:

  var factory = GetFactory(); 

      var messageSender = factory.CreateMessageSender(_queueName); 

      var msg = new BrokeredMessage(partition) 
      { 
       PartitionKey = partition, 
       SessionId = partition 

      }; 
      messageSender.Send(msg); 

我测试它是一个虚拟的IP在hosts文件的主要命名空间URL关联的方式。发送失败时会有一个超时异常(即每个后续请求的情况)。

我猜测ping任务没有选择切换,因为我的发件人永远不会尝试联系辅助命名空间。问题在哪里?

值得一提的是,辅助名称空间中的备份队列已正确创建。

回答

3

PairedNamespaces功能未被记录为使其易于理解或使用的方式。当您发送消息并且主名称空间关闭时,客户端将尝试并最终抛出MessagingCommunicationException。我希望这将是一个指定的例外,表明将进行故障切换,但这只是标准消息传递例外标记为瞬态。 如果您再次重试该消息,它将通过辅助命名空间发送。

我有一个blog post对此有更多的细节/代码。