YARP A/B Testing và Rolling Upgrades (Kiểm thử A/B và Nâng cấp Tuần tự)
Giới thiệu
A/B testing (kiểm thử A/B) và rolling upgrades (nâng cấp tuần tự) yêu cầu các quy trình để phân phối traffic đến một cách linh động nhằm đánh giá các thay đổi trong ứng dụng đích. YARP không có mô hình tích hợp sẵn cho điều này, nhưng nó cung cấp một số cơ sở hạ tầng hữu ích để xây dựng hệ thống như vậy. Xem issue #126 để biết thêm chi tiết về kịch bản này.
Ví dụ
app.MapReverseProxy(proxyPipeline =>
{
// Lựa chọn cluster tùy chỉnh
proxyPipeline.Use((context, next) =>
{
var lookup = context.RequestServices.GetRequiredService<IProxyStateLookup>();
if (lookup.TryGetCluster(ChooseCluster(context), out var cluster))
{
context.ReassignProxyRequest(cluster);
}
return next();
});
proxyPipeline.UseSessionAffinity();
proxyPipeline.UseLoadBalancing();
});
string ChooseCluster(HttpContext context)
{
// Quyết định cluster nào sẽ được sử dụng. Có thể là ngẫu nhiên, có trọng số, dựa trên headers, v.v.
return Random.Shared.Next(2) == 1 ? "cluster1" : "cluster2";
}Cách sử dụng
Kịch bản này sử dụng hai API là IProxyStateLookup và ReassignProxyRequest, được gọi từ một custom proxy middleware như được hiển thị trong ví dụ trên.
IProxyStateLookup là một service có sẵn trong container Dependency Injection (tiêm phụ thuộc) có thể được sử dụng để tra cứu hoặc liệt kê các route và cluster hiện tại. Lưu ý rằng dữ liệu này có thể thay đổi nếu cấu hình thay đổi. Một thuật toán điều phối A/B có thể kiểm tra request, quyết định cluster nào để gửi đến, rồi lấy cluster đó từ IProxyStateLookup.TryGetCluster.
Sau khi cluster được chọn, ReassignProxyRequest có thể được gọi để gán request cho cluster đó. Điều này cập nhật IReverseProxyFeature với thông tin cluster và destination mới cần thiết cho phần còn lại của proxy middleware pipeline để xử lý request.
Session affinity (Ái lực phiên)
Lưu ý rằng chức năng session affinity được chia thành middleware (đọc cài đặt từ cluster hiện tại) và transforms (là một phần của route gốc). Các cluster được sử dụng cho A/B testing nên sử dụng cùng cấu hình session affinity để tránh xung đột.