Partilhar via


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:

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);