介紹
.NET 8 引進了 請求超時中間件,以啟用全域及每個端點的請求超時設置。 在 .NET 8 或更新版本上執行時,YARP 2.1 也提供這項功能。
違約
依預設,要求不會有任何逾時,唯一的例外是用來清除閒置要求的 ActivityTimeout。 RequestTimeoutOptions 中指定的默認原則, 也適用於 Proxy 要求。
與 ActivityTimeout 的互動
路由層級 Timeout 和叢集層級 ActivityTimeout 都適用於代理請求。 了解它們如何互動對於設定適當的逾時非常重要:
ActivityTimeout 是區段
HttpRequest中每個叢集設定的,預設值為 100 秒。 每當請求有活動時,此超時就會被重置。 活動包括接收回應標頭,或成功讀取或寫入要求、回應或串流資料 (例如 gRPC 或 WebSockets)。 TCP 保活機制和 HTTP/2 通訊協定的 ping 不會重設逾時,但 WebSocket 的 ping 會重設逾時。Timeout 是為每條路由進行配置,並指定完成請求所允許的總時間。
哪個逾時優先?
這兩個超時設定同時生效。 如果請求處於 閒置 狀態(無活動),則會 ActivityTimeout 取消它。 如果請求處於 作用中 狀態,但總體上花費的時間太長,路由層級 Timeout 將取消它。 實際上,對於閒置請求,在逾時設定中,較低者將最先生效。
例如:
- 路由
Timeout為 300 秒 ,預設值ActivityTimeout為 100 秒:如果請求變為閒置狀態,則會在 100 秒ActivityTimeout後取消,因為 ,即使路由最多允許 300 秒。 - 使用路由
Timeout為 60 秒 ,預設值ActivityTimeout為 100 秒:如果請求尚未完成,則無論活動為何,請求都會在 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.