Compartilhar via


Diretório de granularidade do Orleans

As granularidades têm identidades lógicas estáveis e podem ser ativadas (instanciadas) e desativadas muitas vezes ao longo da vida útil do aplicativo, mas no máximo uma ativação de granularidade existe em qualquer ponto no tempo. Cada vez que uma granularidade é ativada, ela pode ser colocada em um silo diferente no cluster. Quando uma granularidade é ativada no cluster, ela é registrada no registro global, diretório grain. Isso garante que as invocações subsequentes dessa granularidade sejam entregues a essa ativação da granularidade e que nenhuma outra ativação (instâncias) dessa granularidade será criada. O diretório grain é responsável por manter um mapeamento entre uma identidade de granularidade e onde (em qual silo) sua ativação atual está.

Por padrão, o Orleans usa um diretório interno distribuído na memória. Esse diretório é finalmente consistente e particionado em todos os silos no cluster na forma de uma tabela de hash distribuída.

Começando no 3.2.0, o Orleans também dá suporte a implementações plugáveis do diretório de granularidade.

Dois desses plug-ins estão incluídos na versão 3.2.0:

Você pode configurar qual implementação de diretório grain usar por tipo de granularidade e até mesmo injetar sua implementação.

Qual diretório grain você deve usar?

É recomendável sempre começar com o padrão (diretório distribuído interno na memória). Embora seja finalmente consistente e permita a ativação duplicada ocasionalmente quando o cluster está instável, o diretório interno é autossuficiente sem dependências externas, não requer nenhuma configuração e foi usado em produção o tempo todo.

Quando você tiver alguma experiência Orleans e tiver um caso de uso para um diretório de granulação com garantia de ativação única mais forte e/ou quiser minimizar o número de granularidade que é desativada quando um silo no cluster é desligado, considere usar uma implementação baseada em armazenamento do diretório de granulação, como a implementação do Redis. Tente usá-lo para um ou alguns tipos de granularidade 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 grain na memória será usado automaticamente 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 por meio de um atributo na classe de granularidade e com injeção de dependência e o plug-in de diretório com esse nome durante a configuração do silo.

Configuração de granularidade

Especificando o nome do plug-in do diretório grain com GrainDirectoryAttribute:

[GrainDirectory(GrainDirectoryName = "my-grain-directory")]
public class MyGrain : Grain, IMyGrain
{
    // ...
}

Configuração de silos

Aqui, configuramos a implementação do diretório grain do Redis:

siloBuilder.AddRedisGrainDirectory(
    "my-grain-directory",
    options => options.ConfigurationOptions = redisConfiguration);

O diretório grain do Azure está configurado da seguinte maneira:

siloBuilder.AddAzureTableGrainDirectory(
    "my-grain-directory",
    options => options.ConnectionString = azureConnectionString);

Você pode configurar vários diretórios com nomes diferentes a serem usados para classes de granularidade diferentes:

siloBuilder
    .AddRedisGrainDirectory(
        "redis-directory-1",
        options => options.ConfigurationOptions = redisConfiguration1)
    .AddRedisGrainDirectory(
        "redis-directory-2",
        options => options.ConfigurationOptions = redisConfiguration2)
    .AddAzureTableGrainDirectory(
        "azure-directory",
        options => options.ConnectionString = azureConnectionString);