私は外部システム(具体的にはWebサービス)に対する要求をCQRSベースのシステムに配置する必要があるのだろうかと思います。CQRS - 外部システムへの要求はどこに置くべきですか?
たとえば、外部のフライトサービスに予約要求を送信するシステムがあるとします。 これはドメインオブジェクト内の "bookFlight"のコマンドハンドラにありますか?または、これはドメインオブジェクトイベント "flightBookingPlaced"への反応として、佐賀にあるべきですか?
私は外部システム(具体的にはWebサービス)に対する要求をCQRSベースのシステムに配置する必要があるのだろうかと思います。CQRS - 外部システムへの要求はどこに置くべきですか?
たとえば、外部のフライトサービスに予約要求を送信するシステムがあるとします。 これはドメインオブジェクト内の "bookFlight"のコマンドハンドラにありますか?または、これはドメインオブジェクトイベント "flightBookingPlaced"への反応として、佐賀にあるべきですか?
は、私はいくつかの仮定をします:
私はそれがコマンドまたは一連のコマンドに属していると言います。
ACLまたはファサードの背後にある外部サービスを非表示にするには、コマンドに依存するようにします。このコマンドは、 "not booked"から "booked"への遷移を表します。完了するまで(効果的に)コマンド "ブロック"の複雑さを無視すると、必要なものがカバーされます。
not booked -> booking pending -> booked
起動イベントと予約はない」からの予約状態を変更RequestBookingCommand
をトリガ:それは最高のフィットのように、あなたがよりきめ細かなアプローチをサポートしたい場合は
は、コマンド・アプローチの小さなシリーズは感じています"から"予約保留中 "に変更し、トランザクションをコミットします。これにより、次のコマンドExternalBookingCommand
がトリガされます。このコマンドは、最初にドメインオブジェクトを必要とせずにバックグラウンドで動作します。予約は外部システム上で行うことができ、成功した場合は「予約保留中」から「予約済み」になります。失敗した場合は、予約を再試行するか、予約を「予約失敗」に戻すことができます。
これは、その後、少なくともあなたは二重の書籍にattempingない周りの検証を置く作業を開始することを可能にするなど
私は特にサガして話すことはできませんが、私は、あなたが「予約コマンドのプロトコルを表すことができると思うしたいと思います"少しサガとして"; 1つのドメインの状態(予約されていない状態)から最終的な状態(予約済み状態)へのマッピングを行います。
どちらのアプローチでも、重要なことは、ドメイン状態を防御して、トランザクションが不可欠であることを保証することです。あなたはBookingRequested
状態にあなたを残してRequestBookingCommand
のような何が起こっているのかを記述するために、より良い言語(DDDの教義の1つ)を使うことができるので、州とイベントでより細かく進むことができます。BookingRequested
州で始まるPerformExternalBooking
コマンドBooked
またはBookingFailed
の状態になります。 SuccessfullyBooked
やBookingRequestedOnFoo
などのドメインイベントを導入することもできます。
これらの状況に私がアプローチするのは、通常、それを克服しないようにし、最初に口頭で表現する方法に合ったモデルを作成することです。フレームワークとインフラストラクチャは、技術的な考慮事項(トランザクションや並行性など)に対処するのに役立ちます。
これは内部のマイクロサービスではなく、本当に高速で安定していれば、独自の状態マシンを持つ非同期のアクタであるSaga/Process Manager/Gatewayでこれを実行します。 外部サービスでは、エラー処理、再試行、タイムアウト(すべて非同期)を使用して、集約がブロックされないようにします。
CQRSはこれに関する意見はありません。おそらくDDDタグを追加する必要があります。 – guillaume31