2013-04-27 7 views
7

私は、次のプロジェクト、特にCQRSの設計にDDDの概念を採用しています。CQRSと同期操作(ユーザー登録など)

私は今、簡単な概念の証明を実装しようとしています。

事は、私が始めた後、私はこだわって右のよです:P

私は、簡単なユーザー登録プロセスにこのアプローチを適用する手順がされている場所をしようとしている:

  • ユーザー登録を埋めますフォーム&アプリアプリは、ユーザ(自動ログイン)
  • アプリverificaを送信する認証ユーザ
  • を作成する要求
  • を提出します私はこれまで何を得るのアプリは、実装の観点からの確認メッセージ

でどこか別の場所にユーザーをリダイレクト

  • ユーザーへンの電子メールは、次のとおりです。

    • コントローラのアクションをマップしますRegisterCommandオブジェクトにデータを要求します。
    • コントローラアクションは、RegisterCommandを処理するようにコマンドバスに要求します。
    • コマンドハンドラ(UserService)の "register"メソッドは、新しいUserオブジェクトを作成しますモデルはRegisterEvent
    • コマンドハンドラがそれだ新しいユーザーオブジェクト

    を格納するリポジトリを尋ね、コントローラのアクションのいずれかを知っていません提起する新しいコマンドまたはファクトリオブジェクト)

  • それ。

    私はこのコンテキストのすべてが同期して(電子メールの送信を除いて)実行されているため、直接/同期コマンドバスを使用できます。コントローラアクションでは、コマンドバス呼び出しの直後です私は読取り専用のユーザー(照会データベース)を照会することができます。存在すればすべてがうまくいったと仮定して、ユーザーに確認メッセージを与えることができます。

    自動ログインプロセスは、イベントハンドラによって処理されます。

    これが正しいとすれば、何か問題が生じた場合、正しい情報をユーザーに通知する方法を教えてください。

    一般的な例は、インターネットで見つけることができる記事でよく使用されます。顧客は期限切れのクレジットカードを使用して注文を行います。システムは要求を受け入れ、すべてがOKであることをユーザに知らせるが、ユーザは数分後に注文を処理できなかったことを知らせる電子メールを受信する。

    このシナリオは多くの場合許容されますが、他の場合はこれが不可能です。では、これらのユースケースを扱う例はどこにありますか? :p

    ありがとうございました!

  • +0

    これらのプロセッサは同じスレッドで動作していますか?コマンド/イベントを処理している別のサービスが別の場所で実行されていますか? – Sarmaad

    +0

    スクリプト言語を使用しているため、スレッドはありません。 最終的にはキューイングサーバーが存在する可能性がありますが、このユースケースではないと思います。 – Benjamin

    答えて

    1

    人為的な例の問題は、 "ドメイン"の機能についてのあなたの心を変えることができるということです。そのため、この例を特に議論することはほとんどありません。あなたが推し進めているように見える基本的な前提は、物事がうまくいくと仮定しなければならないということです。他のすべてはリスクに関するもので、それを緩和するものです。この例を見て、私があなたに尋ねると、100000で1人のユーザー登録を失ったらどうなるでしょうか? 10のうち1を失った場合はどうなりますか?なぜそれが起こるだろうか?その時点で私はより大きな問題を抱えていますか?将来のユーザーは、システムがオンラインに戻り、期待どおりに機能するときに再登録する可能性がありますか?それはいつですか?ブランドとの関連性が保証されていないため、サービスの品質を監視してユーザーを登録できない場合はどうなりますか?サーバーが爆発した場合、またはデータセンターが壊れた場合はどうなりますか?それを守りたいのですか?あなたは正しい答えがないことが分かります。グレーのちょうど様々な色合い。では、どのようにリスクを軽減するのでしょうか?物事を同期させることはできますが、それは限られた時点での保証に過ぎません。 2時間前のバックアップを復元する必要がある場合(たとえば、ディスクが壊れているため)これは2時間の登録ユーザーの紛失(多分)です。これらのことが起きる...私はセキュリティの誤った感覚と見なすものの相対性を指摘したがっている。それを緩和し、失うものに投資し、良い監査証跡があることを確認してください。おそらくあなたが探していた答えではありません...

    +0

    私は、あなたが言及したように、 "事はちょうど99.99%の時間で動作する"ということを受け入れなければならないので、最終的には本当に問題ではない "最終的な一貫性"しかし、ユーザー体験の観点からは、登録要求を提出した直後にユーザーにサービスを使用させなければならない場合がありますが、それは何ですか?クライアントがユーザーデータについて想定していることだけに頼ってコンテンツを作成するなどのコマンドを送信させる必要があります。つまり、ユーザー認証は分かりやすい問題です。 – Benjamin

    +0

    いいえ、登録プロセスは完了です。その後、あなたは続行します。簡単です。より良いUXを提供したいですか?なぜユーザーは(ユーザーが登録を確認するまで)一時的なユーザーとして継続し、そのユーザーの登録ユーザーアカウントに暗黙的に関連付けさせてください。または、この特定のユースケースの読取りモデルの更新を同期させるだけですか?多くのオプション、IYAM。 –

    3

    この登録ユースケースは、あなたが思っているよりも、オーダーユースケースの支払いに近いと思います。

    ほとんどのCQRS思考リーダーは、コマンドを発行する前に読み取り側で検証を行い、コマンドの成功確率を高くすることを推奨しています。

    読み取り側で妥当性検査が失敗した場合は、これを処理する方法を理解しています。ユーザーが登録コマンドを送信する前に別の名前を選択させるようにしてください。妥当性検査が成功した場合は、コマンドを送信します。今では、コマンドを検証してから送信するまでに別のユーザーが入ってきて、同じユーザー名を取得する可能性があるので、おそらく数百マイクロ秒です。非常にありそうもない。

    非常にまれなケースでは、期限切れのクレジットカードの例と同じように行動します。次回のログイン時に説明とフォームを提示して、新しいクレジットカードを送信しますユーザー名を入力してください - あるいは、 "ねえ、他の人がそのユーザー名を持っています。ここをクリックして新しいユーザーを選択してください"というメールを送信してください。なぜこれは機能しますか?あなたはそのユーザーの一意のIDを持っているからです。

    Twitterのようなユーザー登録ページを見てください。ユーザー名を入力するとすぐに、少しAjaxコールが行われ、「これは実行されていません」または「これは良いことです」と表示されます。これは事前検証です。

    こちらがお役に立てば幸いです。

    +0

    あなたが説明したシナリオでは大丈夫です。問題は、登録プロセス中に、ユーザーがサーバーが要求を処理するのを待っていることを望んでいないということです。たとえば、ユーザーがコメントを追加するときと同じように、即座にjavascriptでメッセージを表示するなど、偽装することはできません。 さらに一般的に、ユーザーはすぐにサービスを使用することができます。 1.ユーザーはユーザー名/電子メール/パスワードを入力してください 2.ユーザーは自動的にログインし、プロフィールを完了するように招待されます 3.ユーザーは彼のホームページにリダイレクトされます餌や何か他のもの) – Benjamin

    +0

    私はそれが良いと思う。 IDとしてユーザー名を使用していない限り(代理ID(GUIDなど)を使用する代わりに)、ユーザーはログインして自分のホームページに移動することができます。これは、代理IDを使用して意思決定を行うためです。ユーザー名。 – Dan

    +0

    これは理にかなっていますが、実際の状況ではこれでは十分ではありません。ユーザが登録後にリダイレクトされると、彼はそのサービスの利用を開始できると予想しています。あなたは何かをするのを待たなければならないと合理的には言えません。これはひどいユーザーエクスペリエンスです。ホームページでは、ユーザIDだけでなく、より多くの情報を表示したいと思っているかもしれません。システムで完全に認証されていることを確認せずにユーザが操作を実行することは望ましくありません。 – Benjamin