21

現在、CQRSとイベントソーシングアーキテクチャを評価しています。この種の設計を使用することのメンテナンスへの影響が何であるかを理解しようとしています。私が答えを見つけるのに苦労している2つの質問はこれです:

1)アプリケーションが起動してしばらく実行された後、ReadModelデータベースのViewModelにフィールドを追加する新しい要件がある場合はどうなりますか?たとえば、CustomerList ViewModelには顧客の郵便番号が必要ですが、以前は必要ありませんでした。したがって、追加の列はViewModelデータベースに簡単に追加できますが、これはどのように入力されますか?私が見る限り、唯一の方法は、読み取りデータベースをクリアし、すべてのイベントを最初から再生して、ReadModelDatbaseを構築することです。しかし、アプリケーションが数か月または数年にわたって稼働している場合はどうなりますか(私たちが望むように)。これは、郵便番号列のデータを追加するためだけに、何百万ものイベントを再生する可能性があります。

技術的な理由でReadModelデータベースが同期しなくなった場合、または新しいReadModelデータベースを追加したい場合も、同じ懸念があります。アプリケーションが古く、使用するほど、最新のreadmodelを元に戻すのは難しく、費用もかかるようです。それとも私はどこかでトリックを逃していますか?ReadModelスナップショットのようなものですか?

2)読み取​​りデータベースをバックアップするために何百万ものイベントがすべて再生された後、一部のデータが期待されたものと一致しない場合(つまり、見た目が間違っている場合)はどうなりますか。おそらく、イベントの保存または非正規化ルーチンのどこかにバグが原因である可能性があります(コーディングで信頼できることが1つあるとすれば、それはバグのようです)。これをデバッグする方法!それは不可能な仕事のようです。または多分、もう一度、私はトリックを逃しています。

このようなシステムをしばらく実行している人から、メンテナンスとアップグレードのパスがどのように機能したかを聞いてみたいと思います。

いつでもご入力いただきありがとうございます。

4

4 に答える 4

15

前述のように、CQRS でイベント ソーシングを使用する利点は、読み取りモデルを破棄し、最初から再構築できることです。なんらかの理由で、任意の数のイベントを超えた後、長い時間がかかるという考えを人々は持っています。読み取りモデルにリレーショナル データベースを使用している場合 (ほとんどの場合そうです)、トランザクションを開き、ハンドラーを介してすべてのイベントを読み取り、トランザクションをコミットするのは簡単です。実際にディスクに触れるのは、トランザクションがコミットされたときだけです。それ以外はすべてメモリ内で実行されるため、非常に高速です。実際、あなたのシステムがほんの数分で数百万のイベントを処理するのを見ても、私は驚かないでしょう。

読み取りモデルをゼロから再構築すると、イベントを非正規化して読み取りモデルにする日常的な方法とまったく同じように表示されるはずです。そうでない場合は、読み取りモデルの非正規化コードにバグがあります。ここでの素晴らしい点は、メッセージ ハンドラーの観点からは、通常/運用シナリオと読み取りモデルの再構築シナリオで、イベントが受信されて読み取りモデルに非正規化されることに違いがないことです。

バグが発生した場合は、プロダクション イベントをローカル ワークステーションにストリーミング/コピーし、ハンドラーにブレークポイントを設定してから、読み取りモデル処理コードを介してそれらのイベントを実行することで、簡単にデバッグできます。

于 2011-04-07T20:55:30.373 に答える
2

私は CQRS に少し慣れていないので、これが最も望ましいルートではないかもしれません (ただし、CQRS/DDDD メーリング リストの 1 つから拾いました)。

一度実行されてから廃止されることが期待される目的に固有のコマンドと対応するハンドラーを作成します。

ハンドラーでは便利なメカニズムを使用するため、郵便番号フィールドを追加する場合、別のビュー モデルからその時点で郵便番号を取得し、新しい列に入力する 1 回限りのクエリを実行できます。これらのシナリオでは、1 回限りの操作であることが予想されるため、アーキテクチャの純度についてあまり心配する必要はありません (これらの状況では、 Rob Conery の Massiveが使用されて成功しています)。

于 2011-04-07T19:18:26.693 に答える
1

イベント ソーシングで cqrs を使用して実稼働対応のアプリをまだ入手していないので、これを構築しようとした私の経験をここに示します。

1) Read Model rebuild. はい、基本的に、Read Model DB 内の何かが変更されたら、全体を再構築する必要があります。また、イベントが多い場合は、時間がかかる場合があります。そのため、読み取りモデルの再構築は高度に最適化する必要があります (イベントのバッチ処理などを使用します)。読み取り/書き込み比率が高い場合は、イベント ソーシングが最も適していると思います。そのため、非常に揮発性の高いデータについては、ドメイン イベントとして保存しない方が賢明な場合があります。しかし、ストレージ容量に関する問題もそれほど遠くありません。いずれにせよ、cqrs をシステムの一部、つまり最適な場所に適用することができます (たとえば、イベントの一部としてグラフィック イメージを保存することはおそらくないでしょう)。

2) Debugging. イベントの保存にエラーが発生する可能性は非常に低く (フレームワークの問題である必要があります)、どのイベントが保存されているかを常に簡単に確認できます。予期されるイベントを生成するコマンドについては、ここでテストを行う必要があります。これらのテストは、おそらくシステムで最も価値のあるテストになるでしょう。デノーマライザーについては、テストを行うこともできますが、単純なデノーマライザーの正確性が肉眼で確認できる場合は、わざわざテストを書くつもりはありません。そうは言っても、デバッガーを数回使用して、より複雑なデノーマライザーの問題を見つけました。どのイベントが問題を引き起こしているのかを判断しようとするのは、それほど楽しいことではありませんでした。

于 2011-04-07T20:03:09.180 に答える
0

モデルにネッティング イベントを追加することもできます。これは、X 個のイベント (たとえば 500) を受信した後、任意のタスクとして実行できます。

再構築するには、ネッティング イベントに到達するまでイベントをスタックにプッシュします。これがベースラインとして使用されます。ここから、スタックからイベントをポップして、それらの値をベースライン イベントで集計します。

于 2011-04-14T23:26:32.530 に答える