Насколько мне известно, в Azure нет балансировщика нагрузки для внутренних служб, внутренние конечные точки не балансируются по нагрузке. Но может ли кто-нибудь реализовать «мягкое» решение или посоветовать мне прочитать полезные статьи?
Большое спасибо
Есть два способа справиться с этим: один - со службами, работающими на виртуальных машинах, и другой - с сервисами, работающими в веб-ролях / рабочих ролях.
Во-первых: виртуальные машины. Если ваша служба запущена на виртуальной машине, вы можете воспользоваться внешним балансировщиком нагрузки Azure для балансировки нагрузки между несколькими виртуальными машинами, работающими в одной службе. Традиционно это создавало проблему безопасности, поскольку у вас была бы внешняя (входная) конечная точка, открытая для всего мира, и вам нужно было бы соответствующим образом реализовать свою собственную безопасность внутри самих виртуальных машин (iptables / брандмауэр Windows). Есть совершенно новая функция под названием ACL'd Endpoints, которая позволяет разрешать / блокировать доступ к внешней конечной точке на основе диапазонов IP-адресов. Это означает, что любому трафику из облачной службы (будь то виртуальные машины или веб / рабочий) можно должным образом разрешить доступ с помощью простого вызова конфигурации (сегодня только через PowerShell). Вот отрывок из книги Майкла Уошама Сообщение блога об этом:
$acl = New-AzureAclConfig
Set-AzureAclConfig -AddRule Permit -RemoteSubnet "1.2.3.4/32" -Order 1 -ACL $acl -Description "Just for my deployment"
Get-AzureVM -ServiceName myservice -Name myvm |
Set-AzureEndpoint -Name restapi -Protocol tcp -PublicPort 8000 -LocalPort 80 -ACL $acl |
Update-AzureVM
Далее: Интернет / работник. Допустим, вы запускаете частный сервис в рабочей роли с несколькими экземплярами. Вы можете перечислить экземпляры вызывающего объекта (например, экземпляр веб-роли), а затем выбрать один из портов ip + случайным образом (или циклический перебор, или любой другой механизм, который вы выберете). Довольно просто, сделав что-то вроде этого (и позаимствовано из моего ответа StackOverflow Вот):
private String GetRandomServiceIP(String roleName, String endPointName)
{
var endpoints = RoleEnvironment.Roles[roleName].Instances.Select(i => i.InstanceEndpoints[endPointName]).ToArray();
var r = new Random(DateTime.Now.Millisecond);
int ipIndex = r.Next(endpoints.Count());
return endpoints[ipIndex].IPEndpoint.Address.ToString();
}
Программным решением для балансировки нагрузки было бы использование очереди служебной шины с количеством экземпляров рабочей роли> 1. Каждая рабочая роль слушает очередь и обрабатывает сообщения по мере их поступления. Занятые рабочие роли, очевидно, должны будут завершить то, что они есть выполнение перед захватом следующего сообщения из очереди и его обработкой. Таким образом нагрузка распределяется между экземплярами рабочих ролей.