共用方式為


YARP 要求超時

介紹

.NET 8 引進了 請求超時中間件,以啟用全域及每個端點的請求超時設置。 在 .NET 8 或更新版本上執行時,YARP 2.1 也提供這項功能。

違約

依預設,要求不會有任何逾時,唯一的例外是用來清除閒置要求的 ActivityTimeoutRequestTimeoutOptions 中指定的默認原則, 也適用於 Proxy 要求。

與 ActivityTimeout 的互動

路由層級 Timeout 和叢集層級 ActivityTimeout 都適用於代理請求。 了解它們如何互動對於設定適當的逾時非常重要:

  • ActivityTimeout 是區段 HttpRequest 中每個叢集設定的,預設值為 100 秒。 每當請求有活動時,此超時就會被重置。 活動包括接收回應標頭,或成功讀取或寫入要求、回應或串流資料 (例如 gRPC 或 WebSockets)。 TCP 保活機制和 HTTP/2 通訊協定的 ping 不會重設逾時,但 WebSocket 的 ping 會重設逾時。

  • Timeout 是為每條路由進行配置,並指定完成請求所允許的總時間。

哪個逾時優先?

這兩個超時設定同時生效。 如果請求處於 閒置 狀態(無活動),則會 ActivityTimeout 取消它。 如果請求處於 作用中 狀態,但總體上花費的時間太長,路由層級 Timeout 將取消它。 實際上,對於閒置請求,在逾時設定中,較低者將最先生效。

例如:

  • 路由 Timeout300 秒 ,預設值 ActivityTimeout100 秒:如果請求變為閒置狀態,則會在 100 秒 ActivityTimeout後取消,因為 ,即使路由最多允許 300 秒。
  • 使用路由 Timeout60 秒 ,預設值 ActivityTimeout100 秒:如果請求尚未完成,則無論活動為何,請求都會在 60 秒後取消。

偵錯注意事項

這些逾時的關鍵差別是:

  • 當偵錯工具附加至處理程序時,路由層級逾時不會套用,因此可以更輕鬆地進行偵錯執行時間較長的請求。
  • ActivityTimeout 一律會套用,即使已附加偵錯工具也一樣。

若要避免 ActivityTimeout 干擾偵錯或合法的長時間執行請求,請在叢集的 HttpRequest 區段中明確設定:

{
  "Clusters": {
    "cluster1": {
      "HttpRequest": {
        "ActivityTimeout": "00:10:00"
      },
      "Destinations": {
        "cluster1/destination1": {
          "Address": "https://localhost:10001/"
        }
      }
    }
  }
}

配置

超時和超時策略可以透過 RouteConfig 對每個路由進行設定,而且可以從配置檔案的 Routes 區段中綁定。 如同其他路由屬性,這可以修改和重載,而不需重新啟動 Proxy。 原則名稱不區分大小寫。

超時時間會以 TimeSpan 格式(HH:MM:SS)指定。 在相同路由上同時指定 Timeout 和 TimeoutPolicy 無效,並會導致設定遭到拒絕。

請注意,當偵錯工具連接至進程時,不會套用請求逾時。

例:

{
  "ReverseProxy": {
    "Routes": {
      "route1" : {
        "ClusterId": "cluster1",
        "TimeoutPolicy": "customPolicy",
        "Match": {
          "Hosts": [ "localhost" ]
        }
      }
      "route2" : {
        "ClusterId": "cluster1",
        "Timeout": "00:01:00",
        "Match": {
          "Hosts": [ "localhost2" ]
        }
      }
    },
    "Clusters": {
      "cluster1": {
        "Destinations": {
          "cluster1/destination1": {
            "Address": "https://localhost:10001/"
          }
        }
      }
    }
  }
}

逾時原則和默認原則可以在服務集合中設定,而且中間件可以新增,如下所示:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));

builder.Services.AddRequestTimeouts(options =>
{
    options.AddPolicy("customPolicy", TimeSpan.FromSeconds(20));
});

var app = builder.Build();

app.UseRequestTimeouts();

app.MapReverseProxy();

app.Run();

停用自動斷線

在路由的 disable 參數中指定值 TimeoutPolicy 表示要求逾時中間件不會套用至此路由的逾時。

WebSockets

要求逾時會在初始 WebSocket 交握之後停用。 不過,ActivityTimeout 確實適用於 WebSocket 請求。 WebSocket keep-alive 可以透過用戶端或伺服器與 Proxy 通訊來啟用,以防止連線變成閒置並觸發 ActivityTimeout.