イベント ソーシングの構成

この記事では、.NET Orleans のさまざまなイベント ソーシング構成オプションについて説明します。

プロジェクト参照を構成する

Grain Interfaces

前と同様、グレイン インターフェイスは実装に依存しないため、インターフェイスは Microsoft.Orleans.Core パッケージのみに依存します。

グレインの実装

JournaledGrains は、Microsoft.Orleans.EventSourcing パッケージで定義されている JournaledGrain<TGrainState,TEventBase> または JournaledGrain<TGrainState> から派生する必要があります。

ログ整合性プロバイダー

現在、3 つのログ整合性プロバイダー (状態ストレージ、ログ ストレージ、カスタム ストレージ用) が含まれています。 3 つすべてに Microsoft.Orleans.EventSourcing パッケージも含まれています。 したがって、ジャーナル処理されたすべてのグレインには、既にそれらにアクセスできます。 これらのプロバイダーの動作とその違いについては、含まれるログ整合性プロバイダーに関する説明を参照してください。

クラスター構成

ログ整合性プロバイダーは、他の Orleans のプロバイダーと同様に構成します。 たとえば、3 つのプロバイダーをすべて含めるには (もちろん、3 つすべてが必要ない可能性があります)、これを構成ファイルの <Globals> 要素に追加します。

<LogConsistencyProviders>
    <Provider Name="StateStorage"
        Type="Orleans.EventSourcing.StateStorage.LogConsistencyProvider" />
    <Provider Name="LogStorage"
        Type="Orleans.EventSourcing.LogStorage.LogConsistencyProvider" />
    <Provider Name="CustomStorage"
        Type="Orleans.EventSourcing.CustomStorage.LogConsistencyProvider" />
</LogConsistencyProviders>

同じことをプログラムで実現できます。 2.0.0 安定版に移行すると、ClientConfiguration と ClusterConfiguration が存在しなくなります。 これは、ClientBuilderSiloBuilder に置き換えられています (クラスター ビルダーがないことに注意してください)。

builder.AddLogStorageBasedLogConsistencyProvider("LogStorage")

グレイン クラスの属性

ジャーナル処理された各グレイン クラスには、ログ整合性プロバイダーを指定する LogConsistencyProviderAttribute が必要です。 一部のプロバイダーでは、たとえば次のように StorageProviderAttribute も必要です。

[StorageProvider(ProviderName = "OrleansLocalStorage")]
[LogConsistencyProvider(ProviderName = "LogStorage")]
public class EventSourcedBankAccountGrain :
    JournaledGrain<BankAccountState>, IEventSourcedBankAccountGrain
{
    //...
}

そのため、ここでは "LogStorage" が EventSourcing イベントのメモリ ストレージ プロバイダーであるとき、グレイン状態の格納に、"OrleansLocalStorage" を使用しています。

LogConsistencyProvider 属性

ログ整合性プロバイダーを指定するには、グレイン クラスに [LogConsistencyProvider(ProviderName=...)] 属性を追加し、たとえば次のように、クラスター構成で構成されているプロバイダーの名前を指定します。

[LogConsistencyProvider(ProviderName = "CustomStorage")]
public class ChatGrain :
    JournaledGrain<XDocument, IChatEvent>, IChatGrain, ICustomStorage
{
    // ...
}

StorageProvider 属性

一部のログ整合性プロバイダー (LogStorage および StateStorage を含む) は、ストレージとの通信に Standard StorageProvider を使用します。 このプロバイダーは、別の StorageProvider の属性を使用して次のように指定します。

[LogConsistencyProvider(ProviderName = "LogStorage")]
[StorageProvider(ProviderName = "AzureBlobStorage")]
public class ChatGrain :
    JournaledGrain<XDocument, IChatEvent>, IChatGrain
{
    // ...
}

既定のプロバイダー

構成で既定値が指定されている場合は、LogConsistencyProvider および StorageProvider 属性を省略することが可能です。 これは、それぞれのプロバイダーに Default の特別な名前を使用して行います。 次に例を示します。

<LogConsistencyProviders>
    <Provider Name="Default"
        Type="Orleans.EventSourcing.LogStorage.LogConsistencyProvider"/>
</LogConsistencyProviders>
<StorageProviders>
    <Provider Name="Default"
        Type="Orleans.Storage.MemoryStorage" />
</StorageProviders>