Горизонтальное Масштабирование API с Помощью YARP.
Современные веб-приложения должны обслуживать растущее число пользователей и справляться с резкими скачками трафика. Балансировка нагрузки — ключевой метод решения этих проблем и улучшения масштабируемости приложения.
Существует два основных подхода:
1. Вертикальное масштабирование – обновление железа серверов: больше ядер ЦП, больше памяти, более быстрое хранилище.
2. Горизонтальное масштабирование - добавление дополнительных серверов и разумное распределение нагрузки между ними.
Добавляем обратный прокси
YARP — это высокопроизводительная библиотека обратного прокси от Microsoft. Обратный прокси находится перед вашими серверами и управляет трафиком между ними (см. картинку ниже). YARP позволяет выполнять задачи маршрутизации и преобразования входящих запросов до того, как они достигнут ваших внутренних серверов. Входящие запросы к API сначала попадают в YARP, который распределяет трафик на серверы приложений на основе стратегии балансировки нагрузки. В примере на картинке одна база данных, обслуживающая несколько экземпляров приложения.
1. Сначала установим NuGet:
Install-Package Yarp.ReverseProxy
2. Настроим необходимые сервисы и промежуточное ПО:
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddReverseProxy()
.LoadFromConfig(
builder.Configuration
.GetSection("ReverseProxy"));
var app = builder.Build();
app.MapReverseProxy();
app.Run();
3. Добавим конфигурацию в appsettings.json. YARP использует маршруты (Routes) для представления входящих запросов к обратному прокси и кластеры (Clusters) для определения нижестоящих сервисов. Шаблон
{**catch-all} позволяет маршрутизировать все входящие запросы.Существуют различные стратегии балансировки нагрузки:
1. PowerOfTwoChoices - выбирает два случайных пункта назначения и из них тот, у которого меньше назначенных запросов.
2. FirstAlphabetical - выбирает первый доступный целевой сервер в алфавитном порядке.
3. LeastRequests - отправляет запросы на серверы с наименьшим количеством назначенных запросов.
4. RoundRobin - равномерно распределяет запросы по внутренним серверам.
5. Random - сервер выбирается случайным образом для каждого запроса.
Стратегию балансировки нагрузки можно настроить с помощью свойства LoadBalancingPolicy в кластере.
{
"ReverseProxy": {
"Routes": {
"api-route": {
"ClusterId": "api-cluster",
"Match": {
"Path": "{**catch-all}"
},
"Transforms": [{ "PathPattern": "{**catch-all}" }]
}
},
"Clusters": {
"api-cluster": {
"LoadBalancingPolicy": "RoundRobin",
"Destinations": {
"destination1": {
"Address": "http://api-1:8080"
},
"destination2": {
"Address": "http://api-2:8080"
},
…
}
}
}
}
}Итого
YARP — мощный и удобный обратный прокси-сервер для приложений .NET. Однако очень сложные, крупномасштабные распределённые системы могут выиграть от специализированных автономных решений по балансировке нагрузки, которые предлагают более детальный контроль и сложные функции.
См. также Создаём API-Шлюз для Микросервисов с Помощью YARP.
Исходный код с тестами производительности тут.
Источник: https://www.milanjovanovic.tech/blog/horizontally-scaling-aspnetcore-apis-with-yarp-load-balancing