演習 - グレインの状態を保持する

完了

Orleans と 2 つのエンドポイントを使用して基本的な機能を提供するようにアプリが構成されています。 次に、グレイン用の永続的ストレージを追加してこのセットアップを拡張します。 このシナリオでは、わかりやすくするためにメモリ内ストレージを使用します。 ただし、コードの設定後に Azure Blob Storage などのより永続的なストアに切り替えるのは、接続構成の変更と同じくらい簡単であることを覚えておいてください。

グレイン ストレージを構成する

アプリでグレインを格納する方法を構成するには、UseOrleans メソッドを変更します。 アプリの既存の siloBuilder 構成コードを、次の例と一致するように更新します。

builder.Host.UseOrleans(siloBuilder =>
{
    siloBuilder.UseLocalhostClustering();
    siloBuilder.AddMemoryGrainStorage("urls");
});

このコードは、グレインをメモリに格納し、ストレージに urls という名前を付けるよう指示しています。 他のストレージ オプション (Azure Blob Storage など) を使用する場合は、このメソッドを AddAzureBlobGrainStorage に変更し、必要な構成パラメーターを指定します。 Orleans コードの残りの部分は変わりません。

永続化するオブジェクトを作成する

KeyValuePair を使用するのではなく、URL の詳細を保存する新しいクラスを作成します。 このクラスは、短縮されたルート セグメントと完全な URL を保存するために使用されます。 このセットアップにより、両方の項目を必要とされるときにいつでも状態に格納でき、エイリアスを使用して簡単に取得できます。

次のコードを使用して、UrlDetails という名前の新しいクラスをプロジェクトに追加します。

[GenerateSerializer]
public sealed record class UrlDetails
{
    [Id(0)]
    public string FullUrl { get; set; } = "";

    [Id(1)]
    public string ShortenedRouteSegment { get; set; } = "";
}

永続的ストレージを使用するようにグレインを更新する

次の手順では、永続的状態を使用するように UrlShortenerGrain を更新します。

  1. UrlShortenerGrain でプライマリ コンストラクターを使用するようにクラス定義を置き換え、次のコードと一致するように _cache フィールドを削除します。

    public sealed class UrlShortenerGrain(
        [PersistentState(
            stateName: "url",
            storageName: "urls")]
            IPersistentState<UrlDetails> state)
        : Grain, IUrlShortenerGrain
    {
        // Omitted for this step, but will be updated in the next step...
    }
    

    PersistentState 属性は Orleans によって指定されます。 この属性では、グレインの状態値の格納と取得に関連する多数の内部タスクが処理されます。 ユーザーが指定するのは、状態オブジェクトの名前とストレージ サイロの名前だけです。 storageName は、サイロの構成で AddMemoryGrainStorage メソッドに指定した値と同じにする必要があります。

  2. 新しい状態フィールドを使用するようにグレインのメソッドを更新して、次のコードと一致するようにします。

    public async Task SetUrl(string fullUrl)
    {
        state.State = new()
        {
            ShortenedRouteSegment = this.GetPrimaryKeyString(),
            FullUrl = fullUrl
        };
    
        await state.WriteStateAsync();
    }
    
    public Task<string> GetUrl() =>
        Task.FromResult(state.State.FullUrl);
    

    このコードでは次のタスクが実行されます。

    • SetUrl メソッドによって、グレインの状態に保持される UrlDetails に URL エイリアスと完全な URL が割り当てられます。 その状態の管理と構成した場所 (この場合はメモリ内) への保存は Orleans が行います。 ただし、状態はデータベースやサービス (Azure Blob Storage など) にも保存できる点に注意してください。

    • GetUrl メソッドによって、グレインに格納されている UrlDetails から完全な URL が返されて、アプリケーションで使用できるようになります。 エイリアスと完全な URL の両方を保存することで、どちらか一方が必要になる将来のユース ケースで柔軟に対応できます。

これで、アプリケーションが永続的状態をサポートするようになりました。 また、メモリ内ではなく永続的ストレージを使用するように Orleans を構成する場合は、ユーザー セッション間やアプリケーション再起動間で、短縮された URL リダイレクトを保存できるようになりました。