Azure Balanceamento de carga de instâncias internas de funções web / de trabalho?

3

Até onde eu sei, o Azure não possui um balanceador de carga para serviços internos, os endpoints internos não são balanceados por carga. Mas alguém pode ter implementado uma solução "soft" ou pode me aconselhar alguns artigos úteis para ler?

Thx muito

    
por iNc0ming 25.07.2013 / 08:27

2 respostas

3

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();
}
    
por 25.07.2013 / 22:19
0

Uma solução de software para balanceamento de carga seria usar uma fila do Barramento de Serviços com a contagem de instâncias da função de trabalho > 1 Cada função de trabalhador escuta a fila e processa as mensagens conforme elas entram. Funções de trabalho ocupadas obviamente terão que terminar o que estão fazendo antes de pegar a próxima mensagem da fila e processá-la. Dessa forma, a carga é distribuída entre as instâncias da função de trabalho.

    
por 15.06.2014 / 06:49