Compartilhar via


Balanceamento de carga

O balanceamento de carga, em sentido amplo, é um dos pilares do runtime do Orleans. O runtime do Orleans tenta balancear tudo, pois o balanceamento permite maximizar o uso de recursos e evitar hotspots, o que leva a um melhor desempenho, além de ajudar na elasticidade. O balanceamento de carga do Orleans se aplica em vários locais. Veja abaixo uma lista não completa dos locais em que o runtime executa o balanceamento:

  1. A estratégia de posicionamento de ator padrão é aleatória, e novas ativações são colocadas aleatoriamente em vários silos. Isso resulta em um posicionamento equilibrado e evita hotspots na maioria dos cenários.
  2. Um ActivationCountBasedPlacement mais avançado tenta igualar o número de ativações em todos os silos, o que resulta em uma distribuição mais uniforme de ativações entre os silos. Isso é especialmente importante para elasticidade.
  3. O serviço de diretório de granularidade é criado com base em uma tabela de hash distribuída, que é inerentemente balanceada. O serviço de diretório mapeia a granularidade para ativações, cada silo contêm uma parte da tabela de mapeamento global e essa tabela é particionada globalmente de maneira equilibrada em todos os silos. Usamos o hash consistente com buckets virtuais para isso.
  4. Os clientes se conectam a todos os gateways e distribuem as solicitações entre eles, de maneira equilibrada.
  5. O serviço de lembrete é um serviço de runtime particionado distribuído. A atribuição de qual silo é responsável por fornecer qual lembrete é balanceada em todos os silos por meio de hash consistente, assim como no diretório de granularidade.
  6. Os componentes críticos de desempenho em um silo são particionados, e o trabalho entre eles é balanceado localmente. Dessa forma, o runtime do silo pode utilizar totalmente todos os núcleos de CPU disponíveis e não criar gargalos no silo. Isso se aplica a todos os recursos locais: alocação de trabalho para threads, soquetes, responsabilidades de expedição, filas etc.
  7. O QueueBalancerBase faz o balanceamento da responsabilidade de extrair eventos de filas de persistência entre silos no cluster.

O balanceamento não significa necessariamente a perda de localidade. É possível ser equilibrado e ainda manter uma boa localidade. Por exemplo, quando balancear significa fragmentação/particionamento, você pode particionar a responsabilidade para determinada tarefa lógica, mantendo a localidade dentro de cada partição. Isso se aplica ao balanceamento local e distribuído.