Amazon(または他の大規模なeコマースWebアプリケーション)のような会社を想像してみてください。これは、オンラインストアを大規模に運営しており、倉庫に物理的なアイテムの数量が限られている場合、これをどのように最適化して、単一のボトルネック?もちろん、それらにはレプリケーションを備えた多数のデータベースと、独立して負荷を処理する多くのサーバーが必要です。ただし、複数のユーザーが別々のサーバーでサービスを提供されており、両方が同じアイテムをカートに追加しようとし、残りが1つしかない場合、そのアイテムの残り数量には「信頼できる情報源」が必要です。これは、少なくとも、単一のアイテムの製品情報にアクセスするすべてのユーザーが同じデータベースにシリアルでクエリを実行する必要があることを意味しませんか?
分散コンピューティングを使用して大規模なストアを操作し、在庫情報を含む単一のDBに巨大なボトルネックを作成しない方法を理解したいと思います。
ただし、複数のユーザーが別々のサーバーでサービスを提供されており、両方が同じアイテムをカートに追加しようとし、残りが1つしかない場合、そのアイテムの残り数量には「信頼できる情報源」が必要です。
あんまり。これは、100%完璧な技術ソリューションを必要とする問題ではありません。どちらのエラーケースにも、それほど高価ではないビジネスソリューションがあるからです。
実際、私は最近2番目のケースを自分で経験したので、それは仮説ではありません。それが起こって、Amazonがそれを処理する方法です。
これは、理論的には解決が非常に難しい問題(パフォーマンス、最適化など)がある場合によく適用される概念です。多くの場合、ほとんどの場合に非常にうまく機能するソリューションを使用して、それを受け入れることができます。発生時に障害を検出して処理できる限り、失敗します。
の組み合わせ
魔法はなく、ますます複雑な状況になっています。 DNSのように、それはスケーリングするために作られています。
「真実の単一バージョン」はそのようなシステムの一部です。新しいキーの生成は、シーケンスの次の番号を生成するだけの場合よりも複雑な操作になります。たとえば、他のシーケンスが存在します。これは、分散データベースシステムが処理できる複雑さの一種であり、新しいオブジェクトを作成するときにコンポーネントとの間でいくつかの操作を行い、他のユーザーがそれらを使用できるようにし、シーケンスが必要なときに一意になるようにして、複合キーなどを実行します。 。
「最後の在庫あり」の問題が次のように解決されるのを見ました。
すべての在庫レベルを毎日更新し、しきい値レベルに従って製品を高、低、注文済み、または在庫なしのカテゴリーとしてフラグを立てます。
明らかに問題のある「在庫が少ない」アイテム
在庫レベルをチェックする気にしないでください。注文するだけ
「残りわずかです!」を参照するときにユーザーに警告します。彼らが支払いに行くとき、在庫レベルをチェックし、減らします。在庫がない場合は、商品ステータスを更新してください。
このようにして、「在庫不足」のアイテムのみをデータベースにヒットし、顧客が購入プロセスをかなり遠くに行ったときにのみそれを実行します。コストは、一部の顧客が購入を完了できないことです。
ただし、ほとんどの場合、「在庫切れ」は単に別の配送を待っていることを意味するだけなので、とにかく注文を受け入れて、警告を表示するか、配送オプションを制限するだけです。したがって、それらの顧客は失われました。
売上高などの高負荷時に、在庫チェックをオフにして、後で顧客にメールを送信することもできます。「Xを使い果たしてすみません、Yを希望しますか」
基本的に、eコマースプラットフォームの目的がデータベースから読み取られることはありません。常にキャッシュされたページを提供し、クライアント側のすべてを行います。
このビデオでは、Martin FowlerがNoSQLデータベースについて説明しています。
https://www.youtube.com/watch?v=qI_g07C_Q5I
ポイントの1つ(どこか)は、Amazonのような場所では、実際に利用可能かどうかを「確実に」確認できず、注文を受け入れることによって人々の99%を満足させており、 「申し訳ありませんが、誰かがあなたに打ちのめされたようです。」
つまり、あなたが説明するシナリオに対する実際の処理はありません。Amazonが最後に成功した在庫の読み取りに基づいて疑いの恩恵を受け、同時トランザクションが間に落ち込んだ場合-おっと。
(ところで、NoSQLに興味があるなら、これは素晴らしいビデオです)