Existem duas maneiras de lidar com isso: uma delas com serviços em execução em máquinas virtuais e outra para serviços em execução em funções da Web / de trabalho.
Primeiro: máquinas virtuais . Se você tiver seu serviço em execução em uma Máquina Virtual, poderá tirar proveito do balanceador de carga externo do Azure para balancear a carga em várias máquinas virtuais em execução em um único serviço. Tradicionalmente, isso representava um problema de segurança, já que você teria um terminal externo (entrada) aberto para o mundo e precisaria implementar sua própria segurança de acordo com as próprias VMs (iptables / firewall do Windows). Há um novo recurso chamado ACL'd Endpoints, que permite que você permita / bloqueie o acesso a um endpoint externo com base em intervalos de IP. Isso significa que qualquer tráfego de um serviço de nuvem (seja máquinas virtuais ou web / worker) pode ter acesso permitido com uma simples chamada de configuração (somente via PowerShell hoje). Veja um trecho extraído da postagem no blog de Michael Washam, sobre isso:
$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
Próximo: Web / worker . Digamos que você esteja executando um serviço privado em uma função de trabalho, com várias instâncias. Você pode enumerar as instâncias de seu chamador (por exemplo, uma instância de função da web) e, em seguida, selecionar uma das portas ip + aleatoriamente (ou round robin, ou qualquer mecanismo que você escolher). Bastante direto, fazendo algo assim (e emprestado da minha resposta do StackOverflow aqui ):
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();
}