パターンの種類:佐賀

こんにちは、Habr! クリス・リチャードソンの記事「Pattern:Saga」の翻訳を紹介します。


状況


サービスごとデータベースパターンが適用されたアプリケーションがあります。 現在、各アプリケーションサービスには独自のデータベースがあります。 一部のビジネストランザクションは複数のサービスを同時にカバーするため、これらのサービス間のデータの一貫性を確保するメカニズムが必要です。


たとえば、クライアントにクレジット制限があるオンラインストアを開発しているとします。 アプリケーションは、新しい注文が顧客の与信限度を超えないようにする必要があります。 OrdersとCustomerは異なるデータベースであるため、アプリケーションはローカルACIDトランザクションを使用できません。


問題


サービス間のデータの一貫性を確保する方法は?


解決策


いくつかのサービスをカバーする各ビジネストランザクションをサガとして実装する必要があります。


サガは、ローカルトランザクションのコレクションです。 各ローカルトランザクションはデータベースを更新し、メッセージまたはイベントを発行して、サガの次のローカルトランザクションを開始します。 たとえば、ビジネスルールの違反によりトランザクションが失敗した場合、サガは以前のローカルトランザクションによって行われた変更をロールバックするトランザクションの補正を開始します。



サガを調整するには、2つの方法があります。



例:振付ベースの佐賀



振り付けに基づいたサガを使用するオンラインストアでは、注文の作成には次の手順が含まれます。


  1. Order Service ( )は、 保留ステータス(保留)OrderCreated ()OrderCreated ()イベントOrderCreated ()を公​​開しOrderCreated ()
  2. Customer Service ( )はイベントを受け取り、 Customer Service ( )クレジットを予約しようとします。 その後、彼は2つのイベントのいずれかを公開します: CreditReserved ()またはCreditLimitExceeded ()
  3. Order Service ( )はイベントを受信し、注文のステータスを承認済み(確認済み)またはキャンセル済み(キャンセル 済み)に変更します

例:オーケストラサーガ



オーケストレーションベースの物語を使用するオンラインストアでは、注文の作成には次の手順が含まれます。


  1. Order Service ( )は、 保留ステータス(保留)CreateOrderSaga ()を作成し、 CreateOrderSaga ()を作成します
  2. CreateOrderSaga ()は、 ReserveCredit ()コマンドをCustomer Service ( )送信しCustomer Service ( )
  3. Customer Service ( )Customer Service ( )ローンを予約しようとし、応答を送り返します
  4. CreateOrderSaga ()は応答を受け取り、 ApproveOrder ()またはRejectOrder ()コマンドをOrder Service ( )送信しOrder Service ( )
  5. Order Service ( )は、注文のステータスを承認済み(確認済み)またはキャンセル済み(キャンセル 済み)に変更します

佐賀には次の利点があります



サガには次の欠点があります




Source: https://habr.com/ru/post/J427705/


All Articles