Axonは、さまざまなコンポーネントをデカップリングするように設計されています。一部のコンポーネントはコマンドを処理してイベントを生成し、他のコンポーネントはイベントを消費し、クエリモデルを更新します。また、Sagaの場合はコマンドを再度生成します。好ましくは、ユーザインタフェースは、この「最終的に一貫した」方法でも動作するように設計されるべきである。コマンドを送信するとき、戻り値はコマンドが正常に処理されたことを示しているだけで、すべての副作用が実行されたわけではありません。
誇張された例を使用する理由は簡単です。コマンドの結果として生成されたイベントに100のコンポーネントが関心がある場合はどうなりますか。これらの100のコンポーネントがすべて更新されるまで、コマンドハンドラをブロックしますか?これは、スケーラビリティに大きな影響を与えるこれらのコンポーネント間の劇的(技術的)な結合を引き起こすでしょう。
このバックグラウンドを考慮すると、読み込みモデルの変更に基づいてUIを更新する必要があります。すぐにいつでも特定の副作用が起きると予想される場合は、DeferredResultまたはCompletableFutureを使用することは非常にエレガントな方法です。基本的には、「あなたの現在の状態を教えてください」とは対照的に、「私にいつ知ってもらいましょう」と言っているクエリのスタイルです。 また、アップデートをコンシューマにリアルタイムでプッシュすることもできます。 Stomp(Spring Websocket)をベースにしたいくつかのプロジェクトでこれを実装しました。
は、彼らがタイムアウトした場合(DeferredResult.onTimeout()
を参照してくださいにごマップから最終的にクリーン繰延結果に忘れてはいけません。あなたのマシンがあるため、過剰なメモリ消費のクラッシュした場合、それは残念だろう。洞察力のための
感謝を! – sofiaguyang