504 网关超时 - 目标读取超时

您正在查看 ApigeeApigee Hybrid 文档。
此主题没有等效的 Apigee Edge 文档。

症状

此问题会显示为 Gateway Timeout 错误,并返回 HTTP 状态 504

错误消息

您可能会在 API Monitoring调试或其他工具中看到此错误。TARGET_READ_TIMEOUT 原因表示 Apigee 运行时在请求执行期间未收到来自目标的及时响应。

默认目标读取超时值 (io.timeout.millis) 为 55 秒。这意味着,如果 55 秒后目标未响应,则 Apigee 会抛出以下错误:

{"fault":{"faultstring":"Gateway Timeout",
  "detail":{"errorcode":"messaging.adaptors.http.flow.GatewayTimeout",
  "reason":"TARGET_READ_TIMEOUT"}}}

可能的原因

原因 说明 适用的问题排查说明
目标速度缓慢 目标未生成及时响应。 Apigee X 和 Apigee Hybrid
TargetServer 连接问题 如果在 TargetEndpoint 上配置了 <LoadBalancer>,目标会出现一般连接问题。 Apigee X 和 Apigee Hybrid

原因:目标速度缓慢

诊断

您可以使用 Apigee 调试工具诊断目标速度缓慢问题:

  1. 为 API 代理创建调试会话
  2. 在调试会话中,发送请求并检查调试输出。

如上面的示例所示,目标请求超过了 55 秒,即默认目标超时限制。时间限制可配置;如果您更改了超时,则目标请求的时长会与您设置的超时匹配。例如,如果超时时间为 10 秒,则在这种情况下,目标请求将在 10 秒后超时。这种“目标速度缓慢”行为明确表示目标未及时响应请求。

解决方法

Apigee 建议您避免使用慢速目标。 例如,如果正常的目标延迟时间为 50 毫秒,而您遇到的延迟时间为 55,000 毫秒,则可能需要调查目标是否存在问题。

如果您必须增加超时,请按照以下步骤操作:

  1. 点击代理编辑器中的开发标签页。
  2. 在导航窗格中,选择受影响的目标端点。
  3. 在 XML 编辑器中,找到 HTTPTargetConnection XML 元素:

  4. <HTTPTargetConnection> 元素下添加 io.timeout.millis 属性,并指定新的时间限制(以毫秒为单位),例如:
    <HTTPTargetConnection>
      <URL>https://my-very-slow-target.example.com</URL>
      <Properties>
        <Property name="io.timeout.millis">120000</Property>
      </Properties>
    </HTTPTargetConnection>

    在上面的示例中,超时时间增加到 120 秒。请注意,超时时间上限为 300 秒。如需了解详情,请参阅 端点属性参考文档

  5. 保存新修订版本并部署代理。

如果问题仍然存在,请前往下面的必须收集的诊断信息

原因:TargetServer 连接问题

诊断

如果配置了 <LoadBalancer> 端点属性,Apigee 不会揭示连接问题的确切原因。但是,您可以从目标请求过去的时间推断连接问题的原因。作为一种调试方法,您可以尝试完全移除 <LoadBalancer> 元素,并尝试直接在代理中命中目标。

如需诊断问题,请使用调试工具

  1. 为 API 代理创建调试会话
  2. 在调试会话中,发送请求并检查调试输出。

在上面的示例中,超时发生用了 9 秒钟时间。由于不是 55 秒,您知道错误的原因不是因为目标速度缓慢而超出超时限制。默认情况下,如果在 TargetEndpoint 上使用了 <LoadBalancer> 元素,则 Apigee 会额外重试连接两次。由于您已经知道总共尝试了三次连接,并且连接错误的默认超时为三秒 (connect.timeout.millis),因此您可以假设问题是连接问题。

解决方法

如果确认问题是连接超时,请参阅 VPC 对等互连因 TARGET_CONNECT_TIMEOUT 原因出现“503 服务不可用”错误

如果是其他问题,请移除 <LoadBalancer> 元素以调试并显示确切的错误代码,然后在错误目录中查找该代码。

必须收集的诊断信息

如果按照上述说明操作后问题仍然存在,请收集以下诊断信息,然后与 Google Cloud 支持团队联系:

  1. 项目 ID 和 Apigee 组织名称
  2. 代理名称和环境。
  3. 问题的时间范围。
  4. 问题出现的频率
  5. 目标主机名。
  6. 包含问题的调试会话