1. 概要

この記事では、Axonが集約スナップショットをどのようにサポートするかを見ていきます。

この記事は、メインガイドの拡張版であると考えています。 アクソン。 そのため、両方を利用します 軸索フレームワーク と Axonサーバー また。 この記事の実装では前者を使用し、後者はイベントストアとメッセージルーターです。

2. 集約スナップショット

アグリゲートのスナップショットの意味を理解することから始めましょう。 から始めるときイベントソーシングアプリケーションでは、自然な質問はアプリケーションでアグリゲートパフォーマーを調達し続けるにはどうすればよいですか? いくつかの最適化オプションがありますが、最も簡単なのはスナップショットを導入することです。

アグリゲートスナップショットは、ロードを改善するためにアグリゲート状態のスナップショットを保存するプロセスです。スナップショットが組み込まれている場合、コマンド処理の前にアグリゲートをロードすると、次の2段階のプロセスになります。

  1. 最新のスナップショットがある場合はそれを取得し、それを使用してアグリゲートを調達します。 スナップショットにはシーケンス番号が付けられ、どの時点までにアグリゲートの状態を表すかを定義します。
  2. スナップショットのシーケンスから始まる残りのイベントを取得し、残りのアグリゲートを調達します。

スナップショットを有効にする必要がある場合は、スナップショットの作成をトリガーするプロセスが必要です。 スナップショットの作成プロセスでは、スナップショットが作成ポイントでの集約状態全体に類似していることを確認する必要があります。 最後に、集約ロードメカニズム(リポジトリを読み取る)は、最初にスナップショットをロードし、次に残りのイベントをロードする必要があります。

3. Axonでの集約スナップショット

Axon Frameworkは、アグリゲートのスナップショットをサポートしています。 このプロセスの完全な概要については、チェックアウトしてください これ Axonのリファレンスガイドのセクション。

フレームワーク内では、スナップショットプロセスは2つの主要なコンポーネントで構成されています。

スナップショットはスナップショットを構成するコンポーネントですアグリゲートインスタンスの場合はデフォルトでは、フレームワークはアグリゲート全体の状態をスナップショットとして使用します。

SnapshotTriggerDefinition は、スナップショットを作成するためのSnapshotterへのトリガーを定義します。 トリガーには次のものがあります。

  • 一定量のイベントの後、または
  • 読み込みに一定の時間がかかる場合、または
  • 決められた瞬間に。

スナップショットの保存と取得は、イベントストアとアグリゲートのリポジトリにあります。 そのために、イベントストアには、スナップショットを保存するための個別のセクションが含まれています。 Axon Serverでは、別のスナップショットファイルにこのセクションが反映されます。

スナップショットのロードはリポジトリによって行われ、これについてはイベントストアに問い合わせます。 そのため、アグリゲートのロードとスナップショットの組み込みは、フレームワークによって完全に処理されます。

4. スナップショットの構成

私たちは見ていきます 注文ドメイン 前回の記事で紹介しました。 スナップショットの構築、保存、および読み込みは、 Snapshotter 、イベントストア、およびリポジトリによってすでに処理されています。

したがって、 OrderAggregate にスナップショットを導入するには、SnapshotTriggerDefinitionを構成するだけで済みます。.

4.1. スナップショットトリガーの定義

 アプリケーションはSpringを使用するため、SnapshotTriggerDefinitionをアプリケーションコンテキストに追加できます。 そのために、Configurationクラスを追加します。

@Configuration
public class OrderApplicationConfiguration {
    @Bean
    public SnapshotTriggerDefinition orderAggregateSnapshotTriggerDefinition(
      Snapshotter snapshotter,
      @Value("${axon.aggregate.order.snapshot-threshold:250}") int threshold) {
        return new EventCountSnapshotTriggerDefinition(snapshotter, threshold);
    }
}

この場合、EventCountSnapshotTriggerDefinitionを選択しました。 この定義は、集計のイベント数が「しきい値」と一致すると、スナップショットの作成をトリガーします。 しきい値はプロパティを介して構成可能であることに注意してください。

定義にはSnapshotterも必要です。これは、Axonがアプリケーションコンテキストに自動的に追加します。 したがって、トリガー定義を作成するときにパラメーターとして配線できます。

私たちが使用できたもう1つの実装は、 AggregateLoadTimeSnapshotTriggerDefinition。 この定義は、アグリゲートのロードが loadTimeMillisThreshold。 最後に、これはスナップショットトリガーであるため、 スナップショット スナップショットを作成します。

4.2. スナップショットトリガーの使用

SnapshotTriggerDefinition がアプリケーションの一部になったので、OrderAggregateに設定する必要があります。 AxonのAggregateアノテーションを使用すると、スナップショットトリガーのbean名を指定できます。 

アノテーションにBean名を設定すると、アグリゲートのトリガー定義が自動的に構成されます。

@Aggregate(snapshotTriggerDefinition = "orderAggregateSnapshotTriggerDefinition")
public class OrderAggregate {
    // state, command handlers and event sourcing handlers omitted
}

snapshotTriggerDefinition を構築された定義のBean名と等しくなるように設定することにより、このアグリゲート用に構成するようにフレームワークに指示します。

5. スナップショットの実行

構成により、トリガー定義のしきい値が「250」に設定されます。 この設定はを意味します250のイベントが公開された後、フレームワークがスナップショットを作成することこれはほとんどのアプリケーションにとって妥当なデフォルトですが、これによりテストが長くなります。

したがって、テストを実行するには、axon.aggregate.order.snapshot-thresholdプロパティを「5」に調整します。 これで、スナップショットが機能するかどうかをより簡単にテストできます。

そのために、AxonServerとOrderアプリケーションを起動します。 OrderAggregate に十分なコマンドを発行して5つのイベントを生成した後、Axonサーバーダッシュボードで検索することにより、アプリケーションがスナップショットを保存したかどうかを確認できます。

スナップショットを検索するには、左側のタブの[検索]ボタンをクリックし、左上隅の[スナップショット]を選択して、右側のオレンジ色の[検索]ボタンをクリックする必要があります。 次の表は、次のような単一のエントリを示しています。

6. 結論

この記事では、集約スナップショットとは何か、およびAxonFrameworkがこの概念をどのようにサポートするかについて説明しました。

スナップショットを有効にするために必要なのは、アグリゲートでのSnapshotTriggerDefinitionの構成だけです。 スナップショットの作成、保存、取得の作業はすべて私たちの面倒を見てくれます。

Orderアプリケーションの実装とコードスニペットを見つけることができます GitHubで。 このトピックに関するその他の質問については、こちらもご覧ください。 AxonIQについて話し合う.