Azure 服务总线中继偶发性故障异常

Posted

技术标签:

【中文标题】Azure 服务总线中继偶发性故障异常【英文标题】:Azure Service Bus Relay Occasional FaultException 【发布时间】:2013-03-26 20:17:17 【问题描述】:

我们无法确定为什么 Azure BasicHttpRelay 在没有任何详细信息的情况下偶尔会抛出 FaultException。我们已启用 WCF 诊断跟踪,但可用的堆栈跟踪信息仍然相同。 WCF 客户端通道似乎在短时间内失败,然后很快返回。

我们确实缓存了 WCF 通道(例如CreateChannel),但这是我们第一次遇到这种奇怪的行为。我们有其他 Azure 服务总线中继解决方案可以很好地使用这种方法。

错误信息:

处理请求时遇到错误。

堆栈跟踪:

在 System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime 操作,ProxyRpc& rpc) 在 System.ServiceModel.Channels.ServiceChannel.Call(字符串操作,布尔单向,ProxyOperationRuntime 操作,Object[] 输入,Object[] 输出,TimeSpan 超时) 在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage 方法调用,ProxyOperationRuntime 操作) 在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 消息) 在 [0] 处重新抛出异常: 在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg) 在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData,Int32 类型) 在 [我们的 WCF 方法] ...

FaultException - FaultCode 详细信息:

名称: ServerErrorFault 命名空间: http://schemas.microsoft.com/netservices/2009/05/servicebus/relay IsPredefinedFault: false IsReceiverFault: 假 IsSenderFault:

肥皂消息

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header />
  <s:Body>
    <s:Fault>
      <faultcode xmlns:a="http://schemas.microsoft.com/netservices/2009/05/servicebus/relay">a:ServerErrorFault</faultcode>
      <faultstring xml:lang="en-US">There was an error encountered while processing the request.</faultstring>
      <detail>
        <ServerErrorFault xmlns="http://schemas.microsoft.com/netservices/2009/05/servicebus/relay" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" />
      </detail>
    </s:Fault>
  </s:Body>
</s:Envelope>

通过调试,我们可以看到服务器正确响应了消息请求(通过IDispatchMessageInspector),但客户端未能正确处理响应(IClientMessageInspector 报错) .在客户端通道看似更正 自身后,后续的中继请求将成功。这些故障似乎是间歇性的,而不是负载驱动的。我们从未在 Azure 中继之外使用 basicHttpBinding 看到这些 FaultException 错误。

有人有什么建议吗?我们正在使用 Azure SDK 1.8

我尝试使用 owner 共享密钥配置一个新的服务总线中继命名空间,但仍然看到相同的结果。

【问题讨论】:

这些情况多久发生一次?它们不仅仅是随机预期的瞬态问题,是吗? 它们的行为似乎每 10-20 秒发生一次短暂的中继中断 - 因为多个请求在 2-3 秒内收到此错误,只有一个用户负载(平均 3 个请求/秒)。应用程序池在服务托管端永远不会死亡或回收 - 所以它一定是中继本身的问题。 我建议加载系统以获得一些非常一致的指标。它或多或少地每 10 秒发生一次还是随机的?即使您不知道来源是什么,也请尝试更多地了解行为,以便我们能够看到模式并做出有根据的猜测。 最好联系支持人员解决此问题。 @TheDude - 感谢您的提示!我们确实发现这是 Relay 的 Microsoft 错误。他们目前正在努力解决问题。 【参考方案1】:

联系 MS 后 - 这个问题原来是中继或 SDK 的 MS 错误,特别是在使用 Http Connectivity Mode 时。此时,唯一的解决方法是确保您拥有appropriate outgoing TCP ports opened up 以确保与 Azure 中继的可靠连接。

允许Outgoing TCP Ports: 9350 - 9354

MS 告诉我们,他们仍在努力解决根本原因。希望此解决方法对其他人有所帮助。我们的公司防火墙阻止了这些 TCP 端口,这迫使所有通信都通过端口 80,这必须触发此问题。积极的一面是,打开这些端口可以在启动侦听器时更快地连接到中继(AutoDetect 不必每次都检查 TCP 端口的可用性)。

【讨论】:

以上是关于Azure 服务总线中继偶发性故障异常的主要内容,如果未能解决你的问题,请参考以下文章

Azure 服务总线中继 - 从本地获取数据

Azure 服务总线:通过具有内置重试策略的消息泵接收到的瞬时错误(异常)。为啥?

我正在尝试使用 PHP 连接到 Azure 服务总线队列,但我不断收到此错误

服务总线 1.1 和中继绑定

如何记录 Azure 服务总线访问?

服务总线触发 Azure 函数