YARP HTTP.sys Delegation (Ủy quyền HTTP.sys)
Nguồn: YARP HTTP.sys Delegation
Giới thiệu
HTTP.sys delegation (ủy quyền) là một tính năng cấp kernel được thêm vào các phiên bản Windows mới hơn, cho phép một request được chuyển từ hàng đợi HTTP.sys của process nhận sang hàng đợi HTTP.sys của process đích với rất ít overhead hoặc độ trễ bổ sung. Để delegation này hoạt động, process nhận chỉ được phép đọc request headers. Nếu body đã bắt đầu được đọc hoặc response đã bắt đầu, việc cố gắng delegate request sẽ thất bại. Response sẽ không hiển thị với proxy sau khi delegation, điều này hạn chế chức năng của các thành phần session affinity và passive health checks, cũng như một số thuật toán load balancing. Bên trong, YARP tận dụng IHttpSysRequestDelegationFeature của ASP.NET Core.
Yêu cầu
HTTP.sys delegation yêu cầu:
- HTTP.sys server của ASP.NET Core
- Windows Server 2019 hoặc Windows 10 (build number 1809) hoặc mới hơn.
Mặc định
HTTP.sys delegation sẽ không được sử dụng trừ khi được thêm vào proxy pipeline và được bật trong cấu hình destination.
Cấu hình
HTTP.sys delegation có thể được bật theo từng destination bằng cách thêm metadata HttpSysDelegationQueue vào destination. Giá trị của metadata này phải là tên hàng đợi HTTP.sys đích. Address của destination được sử dụng để chỉ định url prefix của hàng đợi HTTP.sys.
{
"ReverseProxy": {
"Routes": {
"route1" : {
"ClusterId": "cluster1",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"cluster1": {
"Destinations": {
"cluster1/destination1": {
"Address": "http://*:80/",
"Metadata": {
"HttpSysDelegationQueue": "TargetHttpSysQueueName"
}
}
}
}
}
}
}Trong cấu hình host, cấu hình host để sử dụng HTTP.sys server:
webBuilder.UseHttpSys();
Trong cấu hình ứng dụng, sử dụng overload MapReverseProxy cho phép bạn tùy chỉnh pipeline và thêm HTTP.sys delegation bằng cách gọi UseHttpSysDelegation:
app.MapReverseProxy(proxyPipeline =>
{
// Add the three middleware YARP adds by default plus the HTTP.sys
// delegation middleware
proxyPipeline.UseSessionAffinity(); // No affect on delegation destinations
proxyPipeline.UseLoadBalancing();
proxyPipeline.UsePassiveHealthChecks();
proxyPipeline.UseHttpSysDelegation();
});Vòng đời của delegation queue (hàng đợi ủy quyền)
Khi YARP được cấu hình để sử dụng delegation cho một destination, một handle được tạo cho hàng đợi HTTP.sys được chỉ định. Handle này được giữ sống miễn là các destination tham chiếu đến nó tồn tại. Việc dọn dẹp các handle này được thực hiện trong quá trình GC (Garbage Collection - thu gom rác), vì vậy có thể việc dọn dẹp handle bị trì hoãn nếu nó kết thúc ở Gen2. Điều này có thể gây ra vấn đề cho một số receivers trong quá trình restart process vì nếu chúng cố gắng tạo hàng đợi trong quá trình khởi động, nó sẽ thất bại vì hàng đợi vẫn tồn tại do YARP đang giữ một handle đến nó. Các receivers phải đủ thông minh để gắn vào thay thế và thiết lập lại hàng đợi đúng cách. HTTP.sys server của ASP.NET Core có vấn đề này. Để biết thêm thông tin, xem Http.sys server should support setting up URL groups when attaching to an existing queue (dotnet/aspnetcore #40359).
YARP cung cấp một cách để reset handle của nó đến hàng đợi. Điều này cho phép người dùng viết logic tùy chỉnh để xác định khi nào handle đến hàng đợi nên được dọn dẹp.
Ví dụ:
var delegator = app.Services.GetRequiredService<IHttpSysDelegator>();
delegator.ResetQueue("TargetHttpSysQueueName", "http://*:80");