Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Orleans garante que, quando uma chamada de grão é feita, uma instância desse grão está disponível na memória em algum servidor no cluster para lidar com a solicitação. Se o grão não estiver ativo no momento no cluster, Orleans escolhe um servidor para ativar o grão. Esse processo é chamado de posicionamento de grãos. O posicionamento também é uma maneira Orleans de balancear a carga: colocar grãos ocupados uniformemente ajuda a distribuir a carga de trabalho pelo cluster.
O processo de posicionamento no Orleans pode ser totalmente configurado. Escolha entre políticas de posicionamento prontas para uso, como aleatória, preferência local e baseada em carga, ou configure a lógica personalizada. Isso permite flexibilidade total na decisão de onde os grãos são criados. Por exemplo, coloque grãos em um servidor próximo aos recursos com os quais eles precisam operar ou perto de outros grãos com os quais eles se comunicam. Por padrão, Orleans escolhe um servidor compatível aleatório.
Configurar a estratégia de posicionamento que Orleans utiliza globalmente ou por classe de grão.
Posicionamento aleatório
Orleans seleciona aleatoriamente um servidor dos servidores compatíveis no cluster. Para configurar essa estratégia de posicionamento, adicione a RandomPlacementAttribute classe de grãos.
Posicionamento local
Se o servidor local for compatível, Orleans selecione o servidor local; caso contrário, ele seleciona um servidor aleatório. Configure essa estratégia de posicionamento adicionando PreferLocalPlacementAttribute à classe de grão.
Posicionamento baseado em hash
Orleans transforma o ID de grão em um número inteiro não negativo e aplica uma operação de módulo com o número de servidores compatíveis. Em seguida, ele seleciona o servidor correspondente na lista de servidores compatíveis ordenados pelo endereço do servidor. Observe que esse posicionamento não tem garantia de permanecer estável à medida que a associação ao cluster é alterada. Especificamente, adicionar, remover ou reiniciar servidores pode alterar o servidor selecionado para uma determinada ID de granulação. Como os grãos colocados usando esta estratégia se registram no diretório de grãos, essa mudança na decisão de posicionamento, quando há alterações na associação, normalmente não tem um efeito perceptível.
Configure essa estratégia de posicionamento adicionando HashBasedPlacementAttribute à classe de grão.
Posicionamento baseado em contagem de ativação
Essa estratégia de posicionamento tenta colocar novas ativações de grãos no servidor menos carregado com base no número de grãos ocupados recentemente. Ele inclui um mecanismo em que todos os servidores publicam periodicamente sua contagem total de ativação para todos os outros servidores. Em seguida, o diretor de posicionamento seleciona um servidor previsto para ter o menor número de ativações examinando a contagem de ativação relatada mais recentemente e prevendo a contagem atual com base em ativações recentes feitas pelo diretor de posicionamento no servidor atual. O diretor seleciona vários servidores aleatoriamente ao fazer essa previsão para evitar que vários servidores separados sobrecarregem o mesmo servidor. Por padrão, dois servidores são selecionados aleatoriamente, mas esse valor pode ser configurado por meio de ActivationCountBasedPlacementOptions.
Esse algoritmo é baseado na tese The Power of Two Choices in Randomized Load Balancing de Michael David Mitzenmacher. Ele também é usado no Nginx para balanceamento de carga distribuído, conforme descrito no artigo NGINX e no algoritmo de Load-Balancing "Power of Two Choices".
Configure essa estratégia de posicionamento adicionando ActivationCountBasedPlacementAttribute à classe de grão.
Posicionamento de trabalhador sem estado
O posicionamento de trabalho sem estado é uma estratégia de posicionamento especial usada pelas granularidades de trabalho sem estado. Esse posicionamento opera quase da mesma forma PreferLocalPlacement, exceto que cada servidor pode ter várias ativações do mesmo grão e o grão não é registrado no diretório de grãos, pois não há necessidade.
Configure essa estratégia de posicionamento adicionando StatelessWorkerAttribute à classe de grão.
Posicionamento baseado em função de Silo
Essa é uma estratégia de posicionamento determinística colocando grãos em silos com uma função específica. Configure essa estratégia de posicionamento adicionando SiloRoleBasedPlacementAttribute à classe de grão.
Posicionamento otimizado de recursos
A estratégia de posicionamento com otimização de recursos tenta otimizar os recursos do cluster equilibrando as ativações de grãos entre silos com base na memória disponível e no uso da CPU. Ele atribui pesos a estatísticas de runtime para priorizar recursos diferentes e calcula uma pontuação normalizada para cada silo. O silo com a pontuação mais baixa é escolhido para colocar a próxima ativação. A normalização garante que cada propriedade contribua proporcionalmente para a pontuação geral. Ajuste os pesos com ResourceOptimizedPlacementOptions base em requisitos e prioridades específicos para recursos diferentes.
Além disso, essa estratégia de posicionamento expõe uma opção para criar uma preferência mais forte para o silo local (aquele que recebe a solicitação para fazer um novo posicionamento) a ser escolhido como o destino para a ativação. Controle isso por meio da LocalSiloPreferenceMargin propriedade, parte das opções.
Além disso, um algoritmo online adaptativo fornece um efeito de suavização, evitando quedas rápidas de sinal ao transformar o sinal em um processo de decrescimento semelhante a um polinômio. Isso é especialmente importante para o uso da CPU e contribui em geral para evitar a saturação de recursos em silos, especialmente os recém-ingressados.
Esse algoritmo baseia-se no posicionamento baseado em recursos com filtragem de Kalman cooperativa de modo duplo.
Configure essa estratégia de posicionamento adicionando ResourceOptimizedPlacementAttribute à classe de grão.
Escolher uma estratégia de posicionamento
Escolher a estratégia de posicionamento de grãos apropriada, além dos padrões Orleans , requer monitoramento e avaliação. A escolha deve ser baseada no tamanho e complexidade do aplicativo, nas características da carga de trabalho e no ambiente de implantação.
O posicionamento aleatório depende da Lei dos Grandes Números; portanto, geralmente é um bom padrão para cargas imprevisíveis distribuídas por muitos grãos (10.000 ou mais).
O posicionamento baseado em contagem de ativação também tem um elemento aleatório, baseando-se no princípio do Power of Two Choices. Esse é um algoritmo comumente usado para balanceamento de carga distribuído e é usado em balanceadores de carga populares. Silos publicam frequentemente estatísticas de tempo de execução em outros silos no cluster, incluindo:
- Memória disponível, memória física total e uso de memória.
- Uso da CPU.
- Contagem total de ativações e contagem de ativação ativa recente.
- Uma janela deslizante de ativações ativas nos últimos segundos, às vezes conhecida como o conjunto de trabalho de ativação.
A partir dessas estatísticas, somente as contagens de ativação são usadas atualmente para determinar a carga em um determinado silo.
Por fim, experimente estratégias diferentes e monitore as métricas de desempenho para determinar o melhor ajuste. Selecionar a estratégia de posicionamento de grãos correto otimiza o desempenho, a escalabilidade e o custo-benefício dos Orleans aplicativos.
Configurar a estratégia de posicionamento padrão
Orleans usa o posicionamento aleatório, a menos que o padrão seja substituído. Substitua a estratégia de posicionamento padrão registrando uma implementação de PlacementStrategy durante a configuração:
siloBuilder.ConfigureServices(services =>
services.AddSingleton<PlacementStrategy, MyPlacementStrategy>());
Configurar a estratégia de posicionamento para uma granularidade
Configure a estratégia de posicionamento para um tipo de grão adicionando o atributo apropriado à classe grain. Atributos relevantes são especificados nas seções de estratégias de posicionamento acima.
Exemplo de estratégia de posicionamento personalizado
Primeiro, defina uma classe implementando a IPlacementDirector interface, exigindo um único método. Neste exemplo, suponha que uma função GetSiloNumber seja definida para retornar um número de silo dado o Guid do grão que está prestes a ser criado.
public class SamplePlacementStrategyFixedSiloDirector : IPlacementDirector
{
public Task<SiloAddress> OnAddActivation(
PlacementStrategy strategy,
PlacementTarget target,
IPlacementContext context)
{
var silos = context.GetCompatibleSilos(target).OrderBy(s => s).ToArray();
int silo = GetSiloNumber(target.GrainIdentity.PrimaryKey, silos.Length);
return Task.FromResult(silos[silo]);
}
}
Em seguida, defina duas classes para permitir a atribuição de classes de grãos à estratégia:
[Serializable]
public sealed class SamplePlacementStrategy : PlacementStrategy
{
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class SamplePlacementStrategyAttribute : PlacementAttribute
{
public SamplePlacementStrategyAttribute() :
base(new SamplePlacementStrategy())
{
}
}
Em seguida, marque todas as classes de grãos destinadas a usar essa estratégia com o atributo:
[SamplePlacementStrategy]
public class MyGrain : Grain, IMyGrain
{
// ...
}
Por fim, registre a estratégia ao compilar o ISiloHost:
private static async Task<ISiloHost> StartSilo()
{
var builder = new HostBuilder(c =>
{
// normal configuration methods omitted for brevity
c.ConfigureServices(ConfigureServices);
});
var host = builder.Build();
await host.StartAsync();
return host;
}
private static void ConfigureServices(IServiceCollection services)
{
services.AddPlacementDirector<SamplePlacementStrategy, SamplePlacementStrategyFixedSiloDirector>();
}
Para obter um segundo exemplo simples mostrando o uso adicional do contexto de posicionamento, consulte PreferLocalPlacementDirectorOrleans no repositório de origem.