質問

CQRS(コマンドクエリ責任の分離)アーキテクチャパターンを使用して、StackOverFlowのようなサイトを構築できますか?私はCQRSとDDD(ドメイン駆動型のデザイン)に比較的新しいもので、パターンを探索し、パターンに精通しているサイトをモデル化しようとしています。 CQRはStackoverflowのようなサイトの多くの側面に役立つことがわかりますが、不可能な領域がいくつかあります(または、少なくとも、すぐにはわかりません)。具体的には:

  • 質問する 質問を作成すると、すぐに表示され、編集できます。 CQRSでは、「AskQuestion」のようなコマンドを発行し、「質問」と呼ばれるイベントが作成されます。最終的に、質問は非正規化されたデータストアにプッシュされます。しかし、経験の経験はすぐです。これはCQRSで可能ですか?
  • 投票 私の票はすぐに反映されます。 CQRSでは、これらのコマンド/イベントが最終的にイベントバスを通り、読み取りストアに移動することを想像します。しかし、すぐに情報を与えてくれます。

私の懸念は、実際に提供される即時のフィードバックの概念に関するものです。 CQRはこれを提供できますか?もしそうなら、これはどのように行われますか?これを処理する方法を示す良い例はありますか?

それが役立つ場合、私の環境はvs2010/c#/sql2008r2ですが、Sqliteなどの他のオプションなどを開いています。ncqrsとlokadのフレームワークも見ています。 。 CQRSサンプルについては、他にあまり見つかりませんでした。

ありがとう!

役に立ちましたか?

解決

あなたが実際に話しているのは、CQRと同時に頻繁に話される「最終的な一貫性」ですが、どちらの手法も個別に使用できます。

最も簡単なことは、UIがすぐに使用しているモデルを更新し、これを使用して質問をユーザーに表示してさらに操作することです。他のユーザーがUIをブロックせずに更新を確認できるように、さまざまな作業を行う必要があります。これが機能するには、コマンドを検証する必要があるので、それを送信する前に成功することはほぼ確実です(実行中にコマンドが失敗した場合は、状況を処理する必要があります。 。

また、通常、この種のことの「偶然」が非常に速いので、他のユーザーにとっても、すべてがすぐに現れることになることを念頭に置く価値があります。

他のヒント

2つの質問を見てみましょう...

質問をするときに質問をするとき、すぐにそれを見て編集できます。 CQRSでは、「AskQuestion」のようなコマンドを発行し、「質問」と呼ばれるイベントが作成されます。最終的に、質問は非正規化されたデータストアにプッシュされます。しかし、経験の経験はすぐです。これはCQRSで可能ですか?

これは簡単に達成できます。すべてのユーザーはすぐに質問を見る必要がありますか、それとも単にそれを尋ねる人だけですか?それが誰にでも表示されるまでに1〜2秒かかる場合、それは違いを生むでしょうか?ほとんどの場合、最終的に一貫したシステムでは、ユーザーがリクエストを送信することと他のすべてのユーザーの違いがあります。

私の投票を投票することはすぐに反映されます。 CQRSでは、これらのコマンド/イベントが最終的にイベントバスを通り、読み取りストアに移動することを想像します。しかし、すぐに情報を与えてくれます。

すぐにそれを与えますか?別の例、Facebookを試してみましょう。何かをクリックすると、これはすぐにあなたの好きなものに現れますか?親指を立てるようなUIのトリックは、あなたがそれを感じているように感じます。別の例、Amazon。カートに追加すると、すぐにカートに入りますか? 「カートに追加」や「親指」のような視覚的表現は、ユーザーがそのように感じられるようになります。

これらのような多くのトリックがあり、最終的に一貫したシステムを完全に一貫したシステムのように感じることができます。

サイドノートとして、多くの人々は、これらの種類のことがスケーラビリティのために行われると考えています(これは場合によってはそうです)。より多くの場合、それらは信頼性のために行われています。 XYZがダウンしている場合、質問が発生します。奇妙なランダム化された局所障害が必要ですか、それとも広範囲にわたる停止の危険を冒したいですか。ここで見るべき最良の例の1つは、AmazonでKindleの購入をチェックアウトすることです。他の人が3〜5秒かかる間、クレジットカードを100msほど処理できるのは奇妙です:)クレジットカード処理システムがダウンした場合はどうなりますか?

質問をすると、UIのデータを「偽造」できます。すぐにユーザー(あなた)に更新されたように見えますが、他のユーザーがあなたの質問を見るまでには時間がかかります。投票を処理するために同じことをする必要があります。

すぐにフィードバックが必要な場合は、他のソリューションを検討する場合があります。しかし、CQRSソリューションですぐにフィードバックを与えるためにできるいくつかのトリックがあります。たとえば、ユーザー名がUNIQEであることを検証する必要がある場合は、読み取りデータベースを照会して、ユーザー名が存在するかどうかを確認できます。そうでない場合は、使用できます。ただし、その間に他のユーザーが同じユーザー名を選択した場合、コマンド側で競合が発生します。これをドメインモデルで処理し、たとえば、ユーザーに生成されたユーザー名を提供し、電子メールで送信する必要があります。彼は後でそれを何か他のものに変更することができます。

偽やトリックでは、このイベントは「保留中のイベント」と考えるかもしれません。これは、コミット/パブリッシュフェーズで成功する可能性が高いが、失敗する可能性があります。 Commitの最初の提出の前にクライアントサイドを実行するほど、成功する可能性が高くなります。したがって、保留中のコミットに依存する場合は、検証とビジネスルールへの露出に関して、より厚いクライアントを計画してください。

その後、ユーザーは、「保留中のコミット」に依存するようにUI内のデータをマークまたはタグ付けすることにより、データの使用(さらなる変更のために)を引き続き使用できるようにすることができます。オブジェクトまたは属性のメタ属性です。もちろん、そのメタ属性を追加して使用すると複雑さが増しますが、アプリケーションに応じて必要なユースケースになる可能性があります。

クライアント側のコマンドキュー/履歴は、その後のイベントが最終的に保留中のコミットに依存している状況を処理するための1つの方法かもしれません。言い換えれば、保留中のコミットに依存しているものはすべて、巻き上げられる可能性のある歴史の一部である可能性があります。保留中のイベントはコミットで成功し、その後のすべてのクライアントサイド履歴は解き始め、キューの次のアイテムを提出し、現在保留中のイベントとしてマークしました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top