故障排查与 API 管理相关的客户端响应超时问题和错误

适用于:所有 API 管理层级

本文帮助你排查 Azure API 管理中的间歇性连接错误和相关延迟问题。 具体而言,本文提供有关源网络地址转换(SNAT)端口耗尽的信息和故障排除。 如果需要更多帮助,请联系 Azure 社区支持 处的 Azure 专家,或向 Azure 支持部门提出支持请求。

症状

通过 API 管理服务调用 API 的客户端应用程序可能会表现出以下一个或多个症状:

  • 间歇性 HTTP 500 错误
  • 超时错误消息

这些症状在 BackendConnectionFailure中作为 的实例列出。

在某些 API 管理服务层中,您还可以在 Azure 门户的“诊断和解决问题”页面上的“SNAT 端口分析”页面中查看与 SNAT 端口耗尽相关的诊断信息。

原因

这种症状模式通常由于 API 管理服务的 SNAT 端口限制而出现。

每当客户端调用某个 API 管理 API 时,Azure API 管理服务将打开一个 SNAT 端口来访问后端 API。 如 Azure 中的出站连接中所述,Azure 使用源网络地址转换(SNAT)和负载均衡器(不向客户公开)在公共 IP 地址空间中与 Azure 外部的终结点通信,以及未使用 虚拟网络服务终结点的 Azure 内部终结点。 这种情况仅适用于在公共 IP 上公开的后端 API。

API 管理服务的每个实例最初都给定了预先分配的 SNAT 端口数。 该限制会影响与同一个主机/端口组合打开的连接数。 重复调用同一个包含地址和端口的组合时,会用尽 SNAT 端口。 释放某个 SNAT 端口以后,即可根据需要重复使用该端口。 只有在等待四分钟后,Azure 网络负载均衡器才会从关闭的连接回收 SNAT 端口。

如果这些端口未关闭并回收足够快,则对 API 的快速连续客户端请求可能会耗尽 SNAT 端口的预分配配额,从而阻止 API 管理服务及时处理客户端请求。

缓解和解决方案

有关缓解 SNAT 端口耗尽的常规策略,请参阅 Azure 负载均衡器文档中的 出站连接故障故障排除 。 在这些策略中,以下各项适用于 API 管理。

启用 Azure NAT 网关

对于 API 管理高级层中的虚拟网络注入实例,可以让 Azure NAT 网关 提供比 API 管理中默认可用的更多 SNAT 端口(最多 64K)。 如果方案中受支持,则此解决方案是避免 SNAT 端口耗尽的最有效方法。

若要在 API 管理实例的虚拟网络中启用 Azure NAT 网关,请使用 API 管理服务:创建或更新 REST API,将实例的 natGatewayState 属性设置为 enabled

注意

  • 目前,若要设置 natGatewayState 属性,实例不能处于区域或区域冗余配置中。
  • 对于以内部模式注入虚拟网络的实例,NAT 网关仅适用于发往 Internet 的出站流量。
  • Azure NAT 网关可能会产生额外的费用。

NAT 网关中设置的默认空闲超时时间为 4 分钟。 可以将空闲超时更改为最多 120 分钟。 有关详细信息,请参阅 管理 NAT 网关

如果无法将 NAT 网关用于出站连接,请参阅本节中所述的其他缓解选项。

扩展 API 管理实例

每个 API 管理实例都根据 API 管理单元分配了多个 SNAT 端口。 可以通过增加单元来扩展 API 管理实例,以分配更多的 SNAT 端口。 有关详细信息,请参阅 缩放 API 管理服务

注意

SNAT 端口使用情况目前不能作为自动缩放 API 管理单元的指标。

为后端 URL 使用多个 IP

从 API 管理实例到后端服务的同一目标 IP 和目标端口的每个连接都使用 SNAT 端口,以便维护不同的流量流。 如果没有后台服务返回流量的不同 SNAT 端口,API 管理无法将一个响应与另一个响应分开。

由于在目标 IP 或目标端口不同的情况下可以重复使用 SNAT 端口,因此,要避免 SNAT 端口耗尽,另一种方法是为后端服务 URL 使用多个 IP。

有关详细信息,请参阅出站代理 Azure 负载均衡器

将 API 管理和后端服务置于同一 VNet 中

如果后端 API 托管在支持应用服务等 服务终结点 的 Azure 服务上,可以通过将 API 管理实例和后端服务置于同一虚拟网络中并通过 服务终结点专用终结点公开它来避免 SNAT 端口耗尽问题。 使用通用 VNet 并将服务终结点放置在集成子网上时,从 API 管理实例到这些服务的出站流量会绕过 Internet,从而避免 SNAT 端口限制。 同样,如果你使用 VNet 和专用终结点,则向该目标发送流量的出站 SNAT 端口将不会有任何问题。

有关详细信息,请参阅如何将 Azure API 管理与虚拟网络配合使用将应用服务与 Azure 虚拟网络集成

将 API 管理服务置于虚拟网络中,并将出站调用路由到 Azure 防火墙

与将 API 管理和后端服务放置在虚拟网络中类似,可以将 Azure 防火墙与 API 管理服务配合使用,然后将出站 API 管理调用路由到 Azure 防火墙。 在 API 管理和 Azure 防火墙之间(放置在同一 VNet 中时),无需 SNAT 端口。 对于与后端服务的 SNAT 连接,Azure 防火墙有 64,000 个可用端口,比分配给 API 管理实例的端口要高得多。

有关详细信息,请参阅 Azure 防火墙 文档。

考虑响应缓存和其他后端性能优化

另一种可能的缓解措施是改善后端 API 的处理时间。 执行此作的一种方法是配置具有响应缓存的某些 API,以减少调用 API 和 API 管理后端负载的客户端应用程序之间的延迟。

有关详细信息,请参阅添加缓存以提高 Azure API 管理中的性能

考虑实施访问限制策略

如果适合你的业务方案,你可以为 API 管理产品实施访问限制策略。 例如,按键速率限制 策略可用于通过限制每个指定时间段内的调用速率来防止每个密钥的 API 使用高峰。

有关详细信息,请参阅 速率限制和配额策略