現在の WebApps/CloudServices スタックの代替として Azure Service Fabric の評価に夜を費やしていますが、状態を持つサービス/アクターをステートフル アクターにする必要がある場合と、ステートレス アクターにする必要がある場合を判断する方法について少し確信が持てません。外部に永続化された状態 (Azure SQL、Azure Storage、および DocumentDB)。これがかなり新しい製品であることは知っています(少なくとも一般の人々にとっては)。したがって、これに関するベスト プラクティスはまだ多くないでしょう。これに対する答え。
私が現在取り組んでいる問題のドメインは、イベント ストアです。アプリケーションの一部はイベント ソーシングと CQRS に基づいており、このイベント ストアを Service Fabric プラットフォームに移行する方法を検討しています。イベント ストアには多くの時系列データが含まれます。そこに永続化されるデータの唯一の信頼できる情報源であるため、一貫性があり、レプリケートされ、何らかの形式の耐久性のあるストレージに保存される必要があります。
私がこれを行うことを検討した 1 つの方法は、ステートフルな「EventStream」アクターを使用することです。イベント ソーシングを使用する集約の各インスタンスは、そのイベントを分離されたストリーム内に格納します。これは、ステートフル アクターが独自のストリームのすべてのイベントを追跡できることを意味し、データの保存方法 (トランザクション、レプリケート、耐久性) に関する要件を満たしていることになります。ただし、一部のストリームは非常に大きくなる可能性があり (数百万とは言わないまでも数十万のイベント)、これが私が確信を持てなくなっているところです。大量の状態を持つアクターを持つことは、これらの大きなデータ モデルをディスクにシリアル化またはディスクから逆シリアル化する必要がある場合に、システムのパフォーマンスに影響を与えると思います。
もう 1 つのオプションは、これらのアクターをステートレスに保ち、Azure SQL などの外部ストレージからデータを読み取らせるか、アクターの代わりにステートレス サービスを使用することです。
基本的に、アクター/サービスの状態の量が「多すぎる」のはいつで、状態を処理する他の方法を検討し始める必要があるのはいつですか?
また、Service Fabric Actors デザイン パターンのこのセクション: Some anti-patterns documentationは、私を少し困惑させます:
Azure Service Fabric アクターをトランザクション システムとして扱います。Azure Service Fabric Actors は、ACID を提供する 2 フェーズのコミット ベースのシステムではありません。オプションの永続性を実装せず、アクターが実行されているマシンが停止した場合、その現在の状態はそれに伴います。アクターは別のノードで非常に高速に起動しますが、バッキング永続性を実装しない限り、状態はなくなります。ただし、再試行、重複フィルタリング、および/またはべき等設計を活用することで、高レベルの信頼性と一貫性を実現できます。
「オプションの永続性を実装しない場合」は、ここで何を示していますか? 状態を変更するトランザクションが成功する限り、データは耐久性のあるストレージに保持され、少なくともレプリカのサブセットに複製されるという印象を受けました。このパラグラフは、アクター/サービス内の状態が失われる状況があるかどうか、またこれは自分で処理する必要があるかどうか疑問に思っています。ドキュメントの他の部分にあるステートフル モデルから得た印象は、この主張を否定しているようです。