Orleans diretório de grãos
Os grãos têm identidades lógicas estáveis e podem ser ativados (instanciados) e desativados muitas vezes ao longo da vida útil da aplicação, mas no máximo uma ativação de grãos existe a qualquer momento. Cada vez que um grão é ativado, ele pode ser colocado em um silo diferente no aglomerado. Quando um grão é ativado no cluster, ele é registrado no registro global, diretório de grãos. Isso garante que invocações subsequentes desse grão serão entregues a essa ativação do grão e que nenhuma outra ativação (instâncias) desse grão será criada. O diretório grain é responsável por manter um mapeamento entre uma identidade grain e onde (qual silo) sua ativação atual está.
Por padrão, Orleans usa um diretório interno distribuído na memória. Esse diretório é eventualmente consistente e particionado em todos os silos no cluster em uma forma de uma tabela de hash distribuída.
A partir da versão 3.2.0, Orleans também suporta implementações conectáveis do diretório grain.
Dois desses plugins estão incluídos na versão 3.2.0:
- Uma implementação da Tabela do Azure: Microsoft.Orleans. GrainDirectory.AzureStorage
- Uma implementação de loja Redis: Microsoft.Orleans. GrainDirectory.Redis
Você pode configurar qual implementação de diretório grain usar em uma base de tipo por grão, e você pode até mesmo injetar sua implementação.
Qual diretório de grãos você deve usar?
Recomendamos sempre começar com o padrão (diretório distribuído interno na memória). Embora seja eventualmente consistente e permita a ativação duplicada ocasional quando o cluster é instável, o diretório interno é autossuficiente sem dependências externas, não requer nenhuma configuração e tem sido usado em produção o tempo todo.
Quando você tiver alguma experiência e Orleans tiver um caso de uso para um diretório de grãos com garantia de ativação única mais forte e/ou quiser minimizar o número de grãos que são desativados quando um silo no cluster é desligado, considere usar uma implementação baseada em armazenamento de diretório de grãos, como a implementação Redis. Tente usá-lo para um ou alguns tipos de grãos primeiro, começando com aqueles que são de longa duração e têm uma quantidade significativa de estado ou um processo de inicialização caro.
Configuração
Por padrão, você não precisa fazer nada; O diretório de grãos na memória será automaticamente usado e particionado em todo o cluster. Se você quiser usar uma configuração de diretório grain não padrão, precisará especificar o nome do plug-in de diretório a ser usado. Isso pode ser feito através de um atributo na classe grain e com injeção de dependência e o plugin de diretório com esse nome durante a configuração do silo.
Configuração de grãos
Especificando o nome do plug-in do diretório grain com o GrainDirectoryAttribute:
[GrainDirectory(GrainDirectoryName = "my-grain-directory")]
public class MyGrain : Grain, IMyGrain
{
// ...
}
Configuração do silo
Aqui configuramos a implementação do diretório de grãos Redis:
siloBuilder.AddRedisGrainDirectory(
"my-grain-directory",
options => options.ConfigurationOptions = redisConfiguration);
O diretório grain do Azure está configurado da seguinte forma:
siloBuilder.AddAzureTableGrainDirectory(
"my-grain-directory",
options => options.ConnectionString = azureConnectionString);
Você pode configurar vários diretórios com nomes diferentes para usar em diferentes classes de grãos:
siloBuilder
.AddRedisGrainDirectory(
"redis-directory-1",
options => options.ConfigurationOptions = redisConfiguration1)
.AddRedisGrainDirectory(
"redis-directory-2",
options => options.ConfigurationOptions = redisConfiguration2)
.AddAzureTableGrainDirectory(
"azure-directory",
options => options.ConnectionString = azureConnectionString);