web-dev-qa-db-ja.com

eコマースWebサイトでバスケットへの同時実行性を管理するためのベストプラクティス

在庫が1つしかない製品を2人の顧客が同時に追加するケースを管理するためのベストプラクティスは何ですか?

これらの2人の顧客の1人が同じ製品を追加しないようにするために、バスケットのコードにチェックが必要ですか?

または、このチェックは、たとえば、関連する製品がまだ在庫にあることを確認するための2番目のクエリを実行する際に、支払いフェーズで実行する必要がありますか?

19
Mik378

この質問に完全な答えはなく、すべて詳細に依存します。

最初の「防衛線」として、私はそのような状況をできるだけ避けようとします。それは、可能な限り低い商品を売り切らないことです。これが可能かどうかは、状況や販売する商品の種類によって異なります。私が働いている会社では、品切れになる前に記事がほとんどウェブサイトから削除されています。しかし、私たちは丸ごと販売しており、残りのいくつかの商品は特別オファーとして営業担当者によって販売されています。これは、特に高額な商品を販売する場合、小規模なショップにとっては選択肢にならない場合があります。

バスケットに何かを追加するときにダブルチェックを行うソリューションはあまり良くありません。人々は、実際に注文することなく、バスケットにたくさん入れました。そのため、この記事が一定期間ブロックされる可能性があります。

だから、小さな仕事に対する私の謙虚な意見では、注文が実際に行われるとき、支払いの直前に最終チェックを行うことが最善の方法です。最悪の場合、在庫切れが今どこにあるのかを顧客に伝える必要があります(小規模なショップではそれほど起こりません)。

11

特定のビジネスケースに適した以下のオプションを選択することがベストプラクティスだと思います

  1. 楽観的オフラインロック

    ...この問題(セッションの競合の問題)を、1つのセッションによってコミットされようとしている変更がの変更と競合しないことを検証することで解決します別のセッション。コミット前の検証が成功するとは、ある意味で、レコードデータの変更を続行してもよいことを示すロックを取得することです。検証と更新が単一のシステムトランザクション内で発生する限り、ビジネストランザクションは一貫性を表示します...

  2. 悲観的なオフラインロック
    ...競合を完全に回避することにより、競合を回避します。これにより、ビジネストランザクションはデータの使用を開始する前にデータのロックを取得するよう強制されます。そのため、ほとんどの場合、ビジネストランザクションを開始すると、同時実行性によって跳ね返ることなく確実に完了することができます。コントロール...
6
gnat

これはpeople問題であり、データベースの問題であり、データベースのロックは簡単です!

顧客がチェックアウトしない可能性があることを考えると…

2つの基本的なオプションがあります。

  • お客様が商品をバスケットに追加した後(在庫レベルを再確認するか、最初からやり直す必要がある場合など)、決められた時間(20分)の間、商品を予約します。これは、イベントや航空会社の座席のチケットによく使用されます。

  • または、「xxxnormal24時間以内に発送されます」のように言いますが、チェックアウト時に在庫を予約します。この場合、キャンセルを許可する必要があります。在庫がある商品とそうでない商品がある場合は、チェックアウト後に注文してください。 (緑、黄、赤の在庫レベルでも十分に機能します。または、一部のWebサイトでは、在庫が1または2になると「在庫不足」と表示されます)

5
Ian

この例では、メッセージキューを使用して注文を処理し、同じ製品で一度に1つのジョブのみをFIFOの方法で順番に処理するように構成しました。

注意点は、注文処理全体に新しいオーバーヘッドが追加され、少し遅れることです。

3
Korayem

いつものように、それはあなたの要件が何であるかに依存します。 Amazonで1日に100,000,000アイテムを販売している場合、プリエンプティブチェックとロックのオーバーヘッドはおそらく法外であり、1日1人の顧客が結局アイテムを取得できないという問題は無視できます。あなたがユニークで高価な珍しいアンティークの宗教的なアイコンを扱っている場合、おそらく逆が当てはまります。あなた自身はあなたのビジネスケースがそのスペクトルのどこに位置するかを知らなければなりません。

2
Kilian Foth

ユーザーにとってのベストプラクティスは、2番目の追加が失敗したことを確認することです。しかし、これは0.1%の場合のためにサイト全体を遅くします。

最も技術的に効率的なソリューションであり、売上を最大化するためのソリューションは、成功させて、後で両方の注文に対応できるようにすることです。ただ今在庫がないため、見つからないわけではありません。非常時には。それができない場合は、誰かが運を上げたユーザーに連絡して謝罪する必要があります。 しかし、今年のクリスマス前に大騒ぎを引き起こしたのはまさにそのためです (これは登場した唯一の記事ではないため、Best Buyに謝罪しましたが、私が最初に見つけたものです)。

あなたの仕事は、ビジネスに選択肢をすべて提示し、賛否両論を示し、アドバイスに基づいてそれらに決定させることです。彼らが評判に時折小さな打撃を与えて売上を最大化できるのであれば、十分に公正です。それらができず、トラフィックが非常に少ないため、二重更新をすばやく確認できる場合は、それも彼らの呼び出しです。

1
pdr