Orleans 粒紋目錄

粒紋具有穩定的邏輯身分識別,且可能會在應用程式生命週期內多次啟動 (具現化) 並停用,但在任何時間點最多只會有一個粒紋啟動。 每次啟動粒紋時,其可能會放在叢集中的不同定址接收器上。 在叢集中啟動粒紋時,其會在全域登錄、粒紋目錄中進行註冊。 這可確保該粒紋的後續調用將會傳遞至該粒紋啟動,且不會建立該粒紋的其他任何啟動 (執行個體)。 粒紋目錄負責保留粒紋身分識別之間的對應,以及 (定址接收器) 其目前啟動的所在位置。

根據預設,Orleans 會使用內建的分散式記憶體內目錄。 此目錄最終會一致,並以分散式雜湊表的形式,跨叢集中的所有定址接收器進行分割。

從 3.2.0 開始,Orleans 也支援可插入的粒紋目錄實作。

3.2.0 版本中包含兩個這類外掛程式:

您可以設定要以每個粒紋類型為基礎使用的粒紋目錄實作,甚至可以插入實作。

您應該使用哪一個粒紋目錄?

建議您一律從預設的粒紋目錄 (內建記憶體內部分散式目錄) 開始。 即使最終為一致,且在叢集不穩定時允許偶爾重複啟動,但內建目錄本身就已足夠,不需要任何外部相依性、不需要任何設定,且已在整個生產環境中使用。

當您有一些 Orleans 的體驗,並且具有更強型單一啟動保證的粒紋目錄使用案例,及/或想要將叢集中的定址接收器關閉時隨即停用的粒紋數目降到最低時,請考慮使用以儲存體為基礎的粒紋目錄實作,例如 Redis 實作。 請先嘗試將其用於一或幾個粒紋類型,從長時間存留且具有大量狀態或昂貴的初始化程序開始。

組態

根據預設,您不需要執行任何動作;記憶體內部粒紋目錄將會自動使用,並分割到整個叢集。 如果您想要使用非預設的粒紋目錄組態,則必須指定所要使用的目錄外掛程式名稱。 這可透過粒紋類別上的屬性與相依性插入,以及在定址接收器設定期間使用該名稱的目錄外掛程式來完成。

粒紋設定

使用 GrainDirectoryAttribute 指定粒紋目錄外掛程式名稱:

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

定址接收器設定

在這裡,我們會設定 Redis 粒紋目錄實作:

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

Azure 粒紋目錄的設定方式如下:

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