Azure API管理(消费层):第一个请求超时,不会发送到后端服务



我有一个服务运行在消费层中运行的Azure API管理实例后面。当一段时间内没有流量发送到API管理实例时(15分钟不足以触发它,但一小时是),发送的第一个请求大约需要3分50秒,并返回具有以下主体内容的HTTP 500:

<html><head><title>500 - The request timed out.</title></head><body>  <font color ="#aa0000">         <h2>500 - The request timed out.</h2></font>  The web server failed to respond within the specified time.</body></html>

以下请求可以正常工作。根据应用程序日志和API管理实例通过ngrok指向我的本地计算机的测试,API管理层甚至没有尝试连接到这些请求的后端。对于本地测试,我在调试器下运行了我的应用程序,在我的服务方法中设置了一个断点(没有身份验证),并观看了";输出";窗口。它从未到达我的断点,也从未在输出窗口中显示任何";500请求超时";要求当我向API管理提出另一个请求时,它按预期转发到我的服务,给我输出并命中断点。

这是API管理消费层的一些已知问题吗?我需要找到一些解决方法(即服务定期对其进行ping)?或者我设置API管理实例的方式可能存在配置问题?

我的API管理实例是通过使用美国中北部消费层的ARM模板部署的,并且具有一些REST和一些SOAP端点(我用于测试的这个请求是SOAP端点之一,使用信封头来指定SOAP操作)。

附加信息:

  • 有问题的请求大约是2KB,来自服务器的响应(在这种情况下不会起作用,因为调用从未到达我的服务器)大约是1KB,所以这不是请求/响应大小的问题
  • 当我打开请求跟踪时(通过发送Ocp-Apim Subscription Key+Ocp-ApimTrace标头),我得到的这个500响应没有Ocp-ApinTrace-Location标头和其他请求的跟踪信息
  • 当我发送2个请求(获得4分钟的500响应,然后是正常的5s 200响应),等待一个小时,然后再发出另一个请求(得到4分钟的延迟和500响应)时,我会出现这种行为,所以我不认为这可能与提供过多流量(至少我的流量太多)的实例有关
  • 进一步的测试表明,这种情况大约每60到90分钟发生一次,即使我每分钟发送一个请求,试图保持APIM实例"可用";"活着">

HTTP 500(内部服务器错误)状态代码表示服务器遇到意外情况,无法完成请求。(可能是由于有效载荷大)。APIM级别没有问题。分析APIM检查器跟踪,您应该会在"转发请求"响应属性下看到HTTP 500状态代码。

您需要了解是谁抛出这些HTTP 404和500响应、APIM或后端SOAP API。获得该答案的最佳方法是收集APIM检查器跟踪以检查请求和响应。使用请求跟踪调试您的API

消费层公开无服务器属性。它在共享基础设施上运行,在没有流量的情况下可以缩减到零,并按每次执行计费。除非后端明确关闭,否则连接将被池化并重用。Api管理服务限制

1。众所周知,这些症状通常是由于APIM的网络地址转换(SNAT)端口限制服务

每当客户端调用您的某个APIM API时,Azure API管理服务将打开SNAT端口以访问您的后端API。Azure使用SNAT和负载均衡器(不向客户公开)与公共IP地址空间中Azure外部的端点以及Azure内部不使用虚拟网络服务端点的端点进行通信。(这种情况仅适用于公共IP上暴露的后端API。)

API管理服务的每个实例最初都被预先分配了一定数量的SNAT端口。该限制会影响打开到同一主机和端口组合的连接。当您重复调用相同的地址和端口组合时,SNAT端口就会用完。一旦SNAT端口被释放,该端口就可以根据需要重复使用。Azure网络负载平衡器仅在等待四分钟后才从关闭的连接中回收SNAT端口。

如果SNAT端口没有足够快地关闭和回收,客户端对API的快速连续请求可能会耗尽预先分配的SNAT端口配额,从而使APIM服务无法及时处理客户端请求。

可以考虑以下策略:

  • 为后端URL使用多个IP
  • 将您的APIM和后端服务放在同一个VNet中
  • 将您的APIM放置在虚拟网络中,并将出站呼叫路由到Azure防火墙
  • 考虑响应缓存和其他后端性能调整(使用响应缓存配置某些API,以减少调用API的客户端应用程序与APIM后端
    负载之间的延迟
    )
  • 考虑实施访问限制策略(通过限制指定时间段的呼叫速率。)

2。转发请求策略将传入请求转发到在请求上下文中指定的后端服务。后端服务URL是在API设置中指定的,并且可以更改使用设置的后端服务策略。

政策声明:

<forward-request timeout="time in seconds" follow-redirects="false | true" buffer-request-body="false | true" buffer-response="true | false" fail-on-error-status-code="false | true"/>

示例:以下API级别策略将所有API请求转发到后端服务,超时间隔为60秒。

<!-- api level -->
<policies>
<inbound>
<base/>
</inbound>
<backend>
<forward-request timeout="60"/>
</backend>
<outbound>
<base/>
</outbound>
</policies>

属性:timeout="整数";

描述:等待HTTP的时间(以秒为单位)在出现超时错误。最小值为0秒。值大于超过240秒可能不会被视为基础网络在此时间之后,基础设施可能会丢弃空闲连接。

必需:无

默认值:无

此策略可用于以下策略部分和范围。

  • 策略部分:后端
  • 策略作用域:所有作用域

查看类似的反馈以供参考。另请参阅APIM 5oo错误的详细故障排除。

最新更新