Миронюк Матвей Лаб. 2 Группа 6512#111
Conversation
+ настроен запуск нескольких реплик сервиса через .NET Aspire + добавлен API Gateway на основе Ocelot + реализован алгоритм Weighted Round Robin + настроено распределение запросов между репликами по весам + обновлена маршрутизация клиентского приложения через gateway + выполнена проверка корректности балансировки через логи и трейсы
+ обновлен readme под лабу + добавлен var.md с описанием проделанной работы + скриншот работы балансировщика
| private static List<ServiceHostAndPort> BuildRotation(IEnumerable<ReplicaNodeOptions> nodes) | ||
| { | ||
| var rotation = new List<ServiceHostAndPort>(); | ||
|
|
||
| foreach (var node in nodes.Where(static n => !string.IsNullOrWhiteSpace(n.Host) && n.Port > 0)) | ||
| { | ||
| var normalizedWeight = Math.Max(1, node.Weight); | ||
|
|
||
| for (var i = 0; i < normalizedWeight; i++) | ||
| { | ||
| rotation.Add(new ServiceHostAndPort(node.Host, node.Port)); | ||
| } | ||
| } | ||
|
|
||
| return rotation; | ||
| } |
There was a problem hiding this comment.
Веса потенциально могут быть огромными, список тогда разрастется. Лучше математически вычислять нужный сервис
There was a problem hiding this comment.
Weighted Round Robin - взвешенная карусель. Каждой реплике сервиса присваивается вес, в зависимости от которого она используется чаще/реже других. При этом сервисы при поступлении запросов перебираются циклически. К примеру, если для реплик [ R1, R2, R3 ] выбраны веса [ 3, 2, 1] , то пришедшие запросы будут маршрутизироваться следующим образом: R1, R1, R1, R2, R2, R3, R1, R1, R1 и т.д.
При текущем алгоритме запросы маршрутизируются так:
R1, R2, R1, R3, R2, R1, R1, R2, R1, ...
There was a problem hiding this comment.
Исправил, теперь балансировка выглядит так:
api-0 -> 1
api-1 -> 2
api-2 -> 3
api-3 -> 2
api-4 -> 1
{ "ReplicaId": "R1", "Host": "localhost", "Port": 15000, "Weight": 1 },
{ "ReplicaId": "R2", "Host": "localhost", "Port": 15001, "Weight": 2 },
{ "ReplicaId": "R3", "Host": "localhost", "Port": 15002, "Weight": 3 },
{ "ReplicaId": "R4", "Host": "localhost", "Port": 15003, "Weight": 2 },
{ "ReplicaId": "R5", "Host": "localhost", "Port": 15004, "Weight": 1 }
+ Теперь используется математическое вычисление нужной реплики через: var index = (int)((currentRequest - 1) % _totalWeight + Реализован классический Weighted Round Robin: теперь последовательность запросов соответствует требованию.
ФИО: Миронюк Матвей
Номер группы: 6512
Номер лабораторной: 2
Номер варианта: 28
Краткое описание предметной области: Сотрудник компании
Краткое описание добавленных фич: