Partilhar via


Balanceamento de carga

O balanceamento de carga, em sentido amplo, é um dos pilares do runtime Orleans. O Orleans tempo de execução tenta manter tudo equilibrado, pois o balanceamento maximiza o uso de recursos, evita pontos críticos, leva a um melhor desempenho e ajuda na elasticidade. O balanceamento de carga aplica-se em vários locais. Abaixo está uma lista não exaustiva de onde o tempo de execução realiza o balanceamento:

  1. A estratégia de posicionamento do ator padrão é aleatória; Novas ativações são colocadas aleatoriamente em silos. Isso resulta em posicionamento equilibrado e evita pontos críticos para a maioria dos cenários.
  2. Uma estratégia mais avançada ActivationCountBasedPlacement tenta equalizar o número de ativações em todos os silos, resultando em uma distribuição mais uniforme entre silos. Isto é especialmente importante para a elasticidade.
  3. O serviço de diretório de grãos baseia-se numa tabela de hash distribuída, que é inerentemente equilibrada. O serviço de diretório mapeia grãos para ativações. Cada silo possui parte da tabela de mapeamento global, e essa tabela é particionada globalmente de forma equilibrada em todos os silos usando hashing consistente com buckets virtuais.
  4. Os clientes se conectam a todos os gateways e distribuem suas solicitações entre eles de forma equilibrada.
  5. O serviço de lembrete é um serviço de tempo de execução distribuído e particionado. A atribuição de qual silo é responsável por servir quais lembretes é equilibrada entre todos os silos através da distribuição por hash consistente, tal como o diretório de grãos.
  6. Os componentes críticos de desempenho dentro de um silo são particionados e o trabalho entre eles é balanceado localmente. Isso permite que o ambiente de execução do silo utilize totalmente todos os núcleos de CPU disponíveis e evitar os gargalos dentro do silo. Isso aplica-se a todos os recursos locais: alocação de trabalho para threads, sockets, responsabilidades de agendamento, filas, etc.
  7. O QueueBalancerBase equilibra a responsabilidade de extrair eventos de filas de persistência em silos no cluster.

O equilíbrio não implica necessariamente na perda de localidade. Você pode alcançar o equilíbrio, mantendo ainda boas condições locais. Por exemplo, quando o balanceamento envolve fragmentação/particionamento, pode-se particionar a responsabilidade de uma determinada tarefa lógica, preservando a localização dentro de cada partição. Isso se aplica ao balanceamento local e distribuído.