Orleans grain 目录

粒子具有稳定的逻辑标识。 它们可以在应用程序的生命周期内激活(实例化)并停用多次,但最多一次激活粒度存在于任何时间点。 每次粒激活时,它都有可能被放置在群集中的不同筒仓上。 当粒度在群集中激活时,它会在 粒度目录中注册自身。 这可确保该粒度的后续调用传递到该激活,并阻止创建该粒度的其他激活(实例)。 粒度目录负责维护粒度标识与其当前激活的位置(接收器)之间的映射。

默认情况下,Orleans 使用内置的分布式内存中目录。 此目录最终一致,以分布式哈希表的形式跨群集中的所有孤岛进行分区。

从 3.2.0 版本开始,Orleans 还支持可插拔的粒度目录实现。

3.2.0 版本中包含两个这样的插件:

你可以根据每个 grain 的类型配置要使用的 grain 目录实现,甚至可以注入自己的实现。

应使用哪个 grain 目录?

建议始终从默认目录(内置内存分布式目录)开始。 尽管它最终是一致的,并且允许在群集不稳定时偶尔重复激活,但内置目录自足,没有外部依赖项,不需要任何配置,并且自开始以来已在生产中成功使用。

当你对 Orleans 有了一些经验并且有需要更强单一激活保证的用例时,或者如果你想在筒仓关闭时将停用的 Grain 数量降到最低,请考虑使用基于存储的 Grain 目录实现,例如 Redis 实现。 首先尝试将其用于一种或几种粒度类型,从生存期较长、状态显著或初始化过程成本高昂的粒度类型开始。

配置

默认情况下,无需执行任何作; Orleans 自动使用内存中粒度目录,并在群集中对其进行分区。 如果要使用非默认粒度目录配置,则需要指定要使用的目录插件的名称。 可以通过粒度类上的一个属性,并在silo配置期间使用依赖项注入来配置具有该名称的目录插件来实现此目标。

Grain 配置

使用 GrainDirectoryAttribute指定粒度目录插件名称。

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

Silo 配置

下面介绍了如何配置 Redis 粒度目录实现:

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

配置 Azure grain 目录,如以下所示:

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

可以配置具有不同名称的多个目录,以用于不同的粒度类:

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