2012-04-27 6 views
3

WCFサービスに接続するクライアントシステムを設計して、データベースの読み書き操作を実行し、通知を受け取る必要があります。WCF + CQRS +プッシュ通知

私はCQRSパターンを使用するように言われました。

例のために、クライアントは、は製品更新製品のリストを取得するなどの操作を実行するためのサービスに接続します。また、を受け入れることもできます。拒否貨物(最初に行うクライアント間で競争が起こる可能性があります)。 1人の顧客だけが出荷を「受け入れる」ことができます。

私はCQRSについてちょっと読んで、読み込みをコマンドから切り離していることを理解しました。私はCQRSを使用している場合しかし、私はいくつかの主要な問題について確認していない:

  1. 私はWCFサービスにCQRSパターンを使用している場合 - 私は、データベース上の同期を行われているものに数えることができますか?私はちょっと混乱しています。なぜなら、サービスがシングルスレッド(将来のスケーラビリティをサポートする)ではないからです。一方、サービスの書き込み操作が正しい順序で実行されるようにするにはどうすればいいですか?または読み取り操作ですか? CQRSパターンは順序付けられた処理を保証するか? (誰かが私に言ったhere CQRSパターンはオフライン処理の要求を更新するために '更新'キューを使用する)。

  2. CQRSを使用すると並行性の問題が解消されますか?

  3. データベースとやり取りするすべてのコマンドハンドラで「TransactionScope」を使用する必要がありますか?

  4. 私は、クライアントのために通知サービスを実装する方法を理解するのに一週間以上を費やしました。私はこのdesignていますdesign http://s16.postimage.org/aqakx6j9f/asdf.png

「製品・サービス」CQRSサービスとなりますが、私は通知サービスに問題があります。クライアントは、カテゴリXの製品について通知されるコマンドを製品サービスに送信することができる。このコマンドは、データベース内の要求を更新する。今のところ通知サービスが15分ごとにデータベースをポーリングし、どのカテゴリでどのユーザーをポーリングするかを確認し、その製品のカテゴリについて通知を要求したユーザーに新しい製品を送信することを確認します。 ユーザーが製品のカテゴリを変更し、他の20人のユーザーが既にこの製品を通知ウィンドウに表示している場合はどうなりますか? 製品がそのカテゴリに属していないことを検出し、のような通知を 'ビューから削除する'という方法が必要です。 これは通知に非常に似ていません。 「データベーステーブルの常時関連のビューを要求し、すべての変更をクライアントの画面に反映する必要があります。」のように聞こえます。 この種の通知サービスを行うにはどうすればいいですか?

答えて

2

これはあなたの特定の質問に対する回答ではないかもしれませんが、CQRSをまったく使用することができるかどうか、なぜ、どの部分で評価するのに役立つかもしれませんか?

具体的には:CQRSは、何に関係なく適用する必要がありますか、アプリケーション全体にわたって最も包括的なアーキテクチャスタイルでもありません。

CQRSは、単一かつ明確に指定された境界付きコンテキスト(Eric Evansによるドメイン駆動型設計を参照)に適用すると、多くの利点をもたらします。あなたやあなたのチームが最初に尋ねるべき

質問:

  • 自分のアプリケーションの有界コンテキストは何ですか?
  • BCごとに:基本的にCRUDですか、より複雑で洗練されたモデリングが必要ですか?
  • CRUDの場合は
  • 複雑な問題が既に解決されている場合はそれを実装しますか?ホイールを再開発する必要があるのか​​、完成したソリューション(概念的にもソフトウェアでさえも)を使用することができますか?
  • この独自のBCは主なビジネス価値を提供し、例えば競争優位の可能性? (ドメイン駆動型設計の「コアドメイン」を参照)
  • 上記が適用され、さまざまなアーキテクチャスタイルを研究し、最適なものを選択する場合は、

短い説明:アプリケーション全体にスタイルを強制しないでください。 BCを特定し、その使用ごとに要件を満たす最も簡単なソリューションを特定します。これはCQRSでも可能ですが、アプリケーション内の1〜2つのBCに対しては最大でも可能です。

最も複雑なアプリケーションの部分の労力を集中させます。は、CQRSを使用して形式化して実装した場合、大きな利点をもたらします。

0
  1. データベースは同期して動作しません。データベースは、データベーストランザクション分離レベルのルールに従ってインターリーブされたトランザクションを使用します。しかし、彼らは取引の一部として指数を更新し、それが重要な部分です。
  2. いいえ、データベーステーブルなど、競合の激しいリソースが存在する複数のリーダーをブロックする単一のライターの問題を解決します。例えば。私が取り組んだシステムでは、爆発データがセンサーから挿入され、ユーザーのためのレポート作成の一部として読み取られました。これは、CQRSがうまく収まる場所です。 CQRSのほとんどの実装では、同時実行性の問題が制御されています。実際には、DDDと一緒に使用すると、同時実行性が重視されるビジネスロジックです。しかし、スタックを持たないか、冪等性やメッセージの順序を変更するなど、他のプロパティを取得することがあります。
  3. 2つのデータベースがあります。 1つは、イベント(イベントソーシングを行っている場合)/エンティティと、イベントごとに最新の状態にしたいビューごとに別の/複数の他のものを保存するものです。
  4. MassTransit + SignalRのようなものを使用したいと思うでしょう。イベントにサブスクライブし、SignalR-hubを介してブラウザに通知をプッシュする読込モデル(基本的にはDTO/)を作成します。