You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用YARP代理时出现间歇性请求失败(下游服务毫秒级响应)

YARP代理间歇性返回状态码0,下游服务已正常响应的排查与解决

使用YARP做反向代理时,出现间歇性HTTP请求失败,返回状态码0的问题:YARP已成功转发请求,下游服务在毫秒级内完成处理并返回200状态码,但YARP端日志显示该请求延迟约40秒后以状态码0结束。


YARP代理日志

2024-03-27T14:27:55.2109958+05:00 [INF] (Microsoft.AspNetCore.Hosting.Diagnostics) Request starting HTTP/1.1 POST http://proxy.geekabyte.com.au/api?vendor=vendor1&msisdn=92XXXXXXXX application/xml 470
2024-03-27T14:27:55.2116887+05:00 [INF] (Yarp.ReverseProxy.Forwarder.HttpForwarder) Proxying to "http://api.geekabyte.com.au/ws?vendor=vendor1&msisdn=92XXXXXXXX" "HTTP/2" "RequestVersionOrLower" "no-streaming"
2024-03-27T14:28:35.2132571+05:00 [INF] (Microsoft.AspNetCore.Hosting.Diagnostics) Request finished HTTP/1.1 POST http://proxy.geekabyte.com.au/api?vendor=vendor1&msisdn=92XXXXXXXX application/xml 470 - 0 - - 40002.2840ms

下游服务日志

2024-03-27T14:47:26.3506452+05:00 [INF] (Microsoft.AspNetCore.Hosting.Diagnostics) Request starting HTTP/1.1 POST http://api.geekabyte.com.au/ws?vendor=vendor1&msisdn=92XXXXXXXX application/xml 470
...
2024-03-27T14:47:26.6469643+05:00 [INF] (Microsoft.AspNetCore.Hosting.Diagnostics) Request finished HTTP/1.1 POST http://api.geekabyte.com.au/ws?vendor=vendor1&msisdn=92XXXXXXXX application/xml 470 - 200 1034 application/xml 296.3219ms

YARP代理配置

"ReverseProxy": {
  "Routes": {
    "locationServiceRoute": {
      "ClusterId": "locationServiceProvider",
      "AuthorizationPolicy": "invokeLocationServicePolicy",
      "Match": {
        "Path": "/api",
        "Methods": [ "POST" ]
      },
      "Transforms": [
        {
          "PathRemovePrefix": "/api"
        }
      ]
    }
  },
  "Clusters": {
    "locationServiceProvider": {
      "Destinations": {
        "destination1": {
          "Address": "http://api.geekabyte.com.au/ws"
        }
      }
    }
  }
}

排查方向与解决步骤

1. 调整请求超时配置

YARP默认超时可能过长,或者客户端提前断开连接,导致YARP无法回传下游响应。在集群配置中添加超时参数,确保等待时间匹配实际场景:

"Clusters": {
  "locationServiceProvider": {
    "Destinations": {
      "destination1": {
        "Address": "http://api.geekabyte.com.au/ws"
      }
    },
    "HttpRequest": {
      "Timeout": "00:00:10" // 设置10秒超时,可根据业务调整
    }
  }
}

2. 修复HTTP版本兼容性问题

YARP日志显示用HTTP/2转发,但下游实际接收的是HTTP/1.1,版本协商异常可能导致连接中断。强制指定HTTP/1.1转发:

"Routes": {
  "locationServiceRoute": {
    // 其他配置不变
    "Transforms": [
      { "PathRemovePrefix": "/api" },
      { "RequestVersion": "HTTP/1.1" } // 强制使用HTTP/1.1
    ]
  }
}

3. 优化连接池设置

TCP连接复用可能残留异常连接,导致YARP转发超时。限制连接复用时长和空闲超时:

"Clusters": {
  "locationServiceProvider": {
    "Destinations": {
      "destination1": {
        "Address": "http://api.geekabyte.com.au/ws"
      }
    },
    "HttpClient": {
      "PooledConnectionLifetime": "00:05:00", // 连接最长复用5分钟
      "PooledConnectionIdleTimeout": "00:02:00" // 空闲连接2分钟后关闭
    }
  }
}

4. 启用响应缓冲避免客户端断开影响

客户端提前断开与YARP的连接时,启用响应缓冲可确保YARP完整接收下游响应,避免异常标记:

"Routes": {
  "locationServiceRoute": {
    // 其他配置不变
    "Transforms": [
      { "PathRemovePrefix": "/api" },
      { "ResponseBuffering": true } // 启用响应缓冲
    ]
  }
}

内容的提问来源于stack exchange,提问作者Waqas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:35:54