背景: MVC アプリには 1 秒あたり 100 以上のトランザクションがあり、詳細なリアルタイム レポートが必要です。
問題: トランザクション データベースに対するレポートは、複雑なレポート ロジック + 遅いレポートの読み込み時間を意味します。大きなレポートは、トランザクション プロセスに悪影響を与える可能性があります。非正規化されたキューブに定期的にデータをプルすると、リアルタイム レポートの制約に違反します
解決策: 状態の変更をトランザクション データベースとキューブに同時に保持し、データがキューブに保持されるときにデータを非正規化します (1 ~ 2 分の待機時間は問題ありません)。
ジレンマ: 各レイヤー、Web、アプリ、トランザクション データベース、およびキューブは水平方向にスケーリングされ、地理的に異なる場所の異なるファームに存在します。
考えられる解決策:
マルチキャストを使用する MSMQ - アプリ サーバーはエンティティの状態が変化したときにメッセージを送信し、トランザクション データベースとキューブ サービスはメッセージを受信して永続化します。長所: 成熟したソリューション、短所: 高可用性を確保するために多くのハードウェアやライセンスが必要 - 翻訳: 高価。
オブザーバー パターン - .net WCF (うーん..) を使用して、データベース サーバーがサブスクライブ (監視) する変更イベントをアプリケーション サーバーに呼び出させます。長所: 余分なハードウェアが不要、短所: WCF。
REST Web サービス - メッセージを送信したりイベントを呼び出したりする代わりに、.net Web クライアントを使用してトランザクション データベースとキューブに投稿します。長所:実装が非常に簡単、短所:アプリケーションサーバーが投稿できるように、データベース側のどこかにIISをインストールする必要があります。
質問 1: 考えられる解決策に関する私の仮定は正しいですか?