OrderとInventoryの2つのマイクロサービスがあるとします。 ProductId
、Qty
などを受け取って注文するAPIinorderサービスがあります。
理想的には、在庫が在庫サービスに存在する場合にのみ注文を許可する必要があります。人々は佐賀パターンまたは他の分散トランザクションを持つことをお勧めします。これは問題なく、結果整合性が利用されます。
しかし、誰かがシステムを悪用したい場合はどうでしょうか。彼は、無効または在庫切れの製品(ProductId
s)で注文をプッシュできます。システムはこれらすべての注文を受け取り、これらの注文をキューに入れ、在庫サービスはこれらの無効な注文を処理します。
これらの無効な注文を次のレベルにプッシュするのではなく(特にproductIdが無効な場合)、これを(注文サービスで)事前に処理するべきではありません
これらのシナリオを処理するための推奨事項は何ですか?
これらのシナリオを処理するための推奨事項は何ですか?
注文サービスに、望ましくない注文を除外するために必要なデータへのアクセスを許可します。
基本的なプロットは、在庫サービスが在庫の状態に対するthe権限であるのに対し、Ordersサービスは在庫のキャッシュされたコピーと連携してどの注文を決定できるかということです。受け入れるために。
在庫への変更は、最終的にOrdersサービスのキャッシュに複製されます。これが「結果整合性」です。在庫が一時的にオフラインになった場合、Order'sはキャッシュ内の情報に基づいてビジネス価値を提供し続けることができます。
キャッシュ内のデータの経過時間にも注意を払うことをお勧めします。キャッシュが最後に更新されてから時間が経過しすぎている場合は、戦略を変更することをお勧めします。
あなたの「集合体」は通常、彼らがキャッシュを扱っていることを知りません。アグリゲートがその作業を行うために必要なクエリをサポートするドメインサービスを注文データと一緒に渡します。ドメインサービスの実装は、キャッシュにアクセスして回答を提供します。
悪用者がドメインサービスの独自のインスタンスを提供したり、キャッシュを直接操作したりすることを許可しない限り、キャッシュされたデータの整合性が保証されます。
(例:テストアグリゲートの場合、特定のテストシナリオに合わせて調整されたキャッシュデータを提供する可能性があります。この種のハイジャックは、悪用者が自分で達成できるようにするものではありません。本番環境)。
無効なビジネスケースをできるだけ多くキャッチできるように、事前に確認することをお勧めします。これに対処する方法はいくつかあります。航空会社の座席を予約するときと同じ状況です。彼らはオーバーブッキングをしますが、今は無視します:)
オプション1:注文の一部として在庫アイテムを予約できます。これはより悲観的なアプローチですが、確認されるのを待つ間、アイテムは予約されます。
オプション2:在庫アイテムが利用可能な場合にのみ注文を受け入れることができますが、not予約して、後で利用できることを期待します。
在庫アイテムが利用できず、バックオーダーをサポートしたい場合は、バックオーダーを作成することもできます。
オプション1を選択した場合、アイテムが顧客Aのために予約されていて、顧客Bが来て注文できない場合、顧客を見逃す可能性があります。顧客Aが注文を完了しないことを決定した場合、在庫アイテムは再び利用可能になりますが、顧客Bはアイテムを調達するために別の場所に移動しました。
注文の履行の一環として、現在アイテムを受け取っていることを在庫制限コンテキストに通知する必要があります。ただし、顧客Aと顧客Bの両方が見積もりを受け入れ、最後のアイテムの注文を作成したことに気付く場合があります。 1つは負けるだろう。この時点で、履行できないものは顧客にメールを送信し、不幸な状況を顧客に通知し、おそらくバックオーダーを作成します。または、X日以内に再試行するようにお客様に依頼します。
ドメインの専門家は、シナリオの処理方法について電話をかける必要があります。これはすべて、アイテムの人気などによって異なります。
注文する前にこのチェックを行わず、通常行われているようにSagasに依存するように説得しようとはしません。これはあなたが実装しなければならないビジネス要件であると私は考えます。
これは私には新しいサブドメインのように思えます:悪用者を防ぐという新しい責任を伴う不正行為防止(またはそれをどのように呼びたいか)。この責任をOrderマイクロサービスに追加することはできますが、SRPを破ることになります。したがって、別のマイクロサービスで実行する必要があります。
この新しいマイクロサービスは、API Gateway(ある場合)またはOrdersマイクロサービスから呼び出されます。
(さまざまな理由で)新しいマイクロサービスを追加しない場合は、この新しい機能をOrdersマイクロサービス内のモジュールとして実装できますが、ホスト(個別のプライベート永続性/データベース/テーブル)から高度に分離することを強くお勧めします)。