2012-01-15 6 views
9

私は、購入を完了するためにPayPal APIを使用してRuby on Railsを使用して中古商品のeコマースマーケットプレイスを作成しています。つまり、基本的には、eBayやHalf.comなど、人々が自分のものを売買できるということです。すべてのアイテムが使用されます。ここで私の質問です:中古品はすべての商品がユニークであることを意味します - 少なくとも、売り手は通常、売っている中古品のうちの1つしか運んでいません。それは前にこの種の問題に遭遇しているすべての開発者のために、私は私の質問をもたらします:どのように私はどのような状況に対処する必要があります電子商取引アプリケーションデザイン:中古品のウェブサイトでショッピングカートを管理する方法は?

  • 売主は、彼のカートにトレーナーを追加し、彼のトレーナー
  • のPerson#1を示しています
  • 人#2が今

ペイパルを通じて彼のカートに

  • 人#1チェックを同じトレーナーを追加し、私は人の#2で何をしますか?明らかに、売り手は1つのスエットシャツしか持っていないので、彼は同じスエットシャツをチェックアウトすることはできません。私が知りたいことは、このような状況にどう対応すべきかです。これまでのところ、私は2つの可能な解決策を思いついたが、どちらも満足できるものではなかった。 (ちなみに、ユーザーの現在のカートがセッション変数であることを追加することは関係あります)

    オプション1:Person#1が自分のカートにスエットシャツを追加すると、スエットシャツはavailable = false。これの欠点は、ユーザーがカートにアイテムを追加してアイドル状態になることです。従って、人#1のカートが期限切れになるまで、誰もその商品を購入することはできない。

    オプション#2:スエットシャツは、PayPalからIPNを取得した場合にのみ使用できないとフラグされます。これの欠点は、理論的には、#1と#2を一度にPayPalからチェックアウトすることができるということです。そのため、トレーナーを購入することになります。IPNを取得した後でも、製品を2回販売しました。

    StackOverflowとは何ですか?この分野で経験のある人は誰ですか?ここで

  • 答えて

    7

    は契約です -

    • 売主は、彼のトレーナー
    • のPerson#1を示しています
    • 人#2彼のカートにトレーナーを追加し、彼のカートに
    • のPerson#1を同じトレーナーを追加PayPalでチェックアウト
    • あなたの在庫に1つの数量を持っている同じアイテムを購入することを、それらの両方が終了するのを防ぐ。私の意見では、このシナリオを処理する1つの方法は、(あなたのオプション#1のアップグレード版の一種である)である

    -

    人1は、あなたが(IF意志彼らのカート内の項目を追加そうでなければ)カート内で住所お支払い完了などの注文状況を変更する必要があります。そのカートにそれらを追加するために他の人のために10分のためにそれをブロックする(人2):

    だから人1項目彼らのカート内のin cartステータス)を追加したとき。今、あなたは10のためにorders tablein cartと状態のこの場合Item Aには、すべての製品をチェックあなたのサーバー上で実行されているしわくちゃ婆ジョブを使用して仕事遅延すくいスクリプトまたはを持っている必要がありますか10分以上経過し、それらをフラッシュ/除去するから。これにより他人(人2)がそのアイテムをカートに追加できます。また、この10分のフラッシング物について、何らかの通知をして他人に(人2)、人1人にという更新情報があります。たとえば:項目1項目1 2人へとTime Counter runningで利用できるようになりますがTime Counter running 1人にして行きます。このプロセスでは、ユーザーの心の中で緊急感を感じるでしょう。が手元にある/数量以上のアイテムを販売していないことから在庫を管理できます。あなたはこのウェブサイトをライブで実行中の実装でチェックすることができます。 - http://www.thepeacockparade.com/

    この状況を処理するには、あなたに公正なアイデアがあることを願っています。そして、もしあなたが同じようなことをするより良い方法を手に入れたら、私はそれについて更新しておいてください。私もアップグレードを探しています。

    おかげ

    パフォーマンスに更新

    このプロセスを実施した後、あなたのウェブサイトにを発行し、いくつかのパフォーマンスで終わることがあります。私はあなたのアプリケーションの実行を維持する方法を考え出したと、あなたの顧客にサービスを提供して、同時に同期バックグラウンド・プロセスは、あなたがamazon rdsまたはその他のクラウドデータベースサービスを使用場合は、別の2を持つことができ、ある一つの方法アプリケーションサーバーあなたの顧客にサービスを提供するためのものと、一時的なデータ、ファイル、レーキタスクのクリーンアップ、データのアップロードなどのバックグラウンドプロセスを実行するためのもの。データベース完全にあなたのアプリケーションサーバーの外にあります。アプリケーション。したがって、バックグラウンドプロセスで使用されるメモリを枯渇させるのではなく、メインアプリケーションをユーザーに役立てることができます。それはデータベーステーブル団体に来るとき、データベースの設定

    on Railsの

    更新が素晴らしいです。 アマゾンクラウドデータベースサービスを初めてご利用の方は、こちらのプランをご確認ください:http://aws.amazon.com/rds/pricingAmazonでデータベースを持っていることについての最もよい部分RDSがある - あなたが あなたデシベルの待ち時間を短縮します には、アプリケーションのためのデータベースを提供近くエンドポイント/サーバーの場所を選択するのは自由です

    • サーバーロードを処理する際にクエリを実行します。
    • 複数のアプリケーションを使用してアクセスすることができます。明らかに異なる目的、つまりデータをアップロードするためのもの、アナリティクスを実行するためのものなど
    • あなたは何を使用するかだけを支払う必要があります。
    • 何か(時には何らかの理由で私が悲観論者であることを好む)何かが間違っていて、奇妙な理由でサーバーがクラッシュする。あなたは犯されていません!! データベースは安全です。ちょうど新しいアプリケーションとvoilaをセットアップ!あなたはすぐに戻ってきます。
    • データベースバックアップを自動化することができます。BASHスクリプトに頭をぶつけません。
    • あなたのビジネスが成長するにつれてそれを拡張することができます。 https://console.aws.amazon.com/rds/home

    はがあなたのアマゾンRDSコンソールに行くアマゾンRDSデータベースを設定するには。希望するものを選択ナビゲーションペインの左側にあります。あなたはRDSインスタンス実行している場合は、「起動DBインスタンス」ボタンをクリックして、あなたがデータベースを優先選択して、流れの残りの部分に従う、すなわち選択インスタンスは今など

    を入力し、次のように表示することができます次のようなエンドポイント:database-name.random-string.region-endpoint.rds.amazonaws.comあなたの設定あなたRailsアプリケーションで編集、更新/ database.ymlのこれに:

    production: 
        adapter: mysql2 
        host: database-name.random-string.region-endpoint.rds.amazonaws.com 
        encoding: utf8 
        reconnect: false 
        database: databse-name 
        username: master-username 
        password: password 
    

    は驚いて見えました?はい、それです!新しいアマゾンrds DBインスタンスでアプリケーションを使用するように設定されています。今すぐ接続をテストするためにrake db:createテーブルを作成するにはrake db:migrateを入力してください。

    もう1つ追加したいと思います。あなたの人生をより良くしたい場合は、アマゾンs3(簡易ストレージサービス)も使用するべきです。安価で信頼性の高い、ここにチェックしてください:http://aws.amazon.com/s3/

    お楽しみください!

    +0

    同時に、彼らのカートに同じ製品を追加しようと競合状態を防ぐために、楽観的ロックになっているはずです!非常に詳細な応答をありがとう - 私はタイマーがユーザーに「緊急性の感覚」を与え、それゆえに後ではなく早く購入するインセンティブを与えるため、このアイデアはたくさんあります。 。もっと多くのアイデアを得るためにこの質問を数日間開いたままにしておきますが、これは素晴らしい答えです。どうもありがとう。 +1 – varatis

    +0

    大歓迎です。しかし、私はこれをクラックするために、さらにパフォーマンスを損なうことなく、もっと良いアイデアを見つけようとしています。これを投稿した後、私はこのプロセスについてもう少し考えて、あなたのパフォーマンスを維持し、そのプロセスを維持し、同期させるアイデアに終わった。投稿の更新部分をご覧ください。 – Surya

    +0

    それはサーバーで興味深い考えです。 Half.comやAmazonがこのような状況をどのように処理しているのか、あなたの元々のアイデアについては興味があります。どちらのサイトでもチェックをしていませんが、カートに同じアイテムを追加します。 – varatis

    12

    ロックされたフラグを持ち、ロックされたアイテムを検出してそのロックを失効させるバックグラウンドプロセスを持つ代わりに、代わりにlocked_bylocked_untilフラグを持つことができます。

    人が自分のカートに何かを追加するときは、locked_byに、後にはlocked_untilに設定してください。 locked_untilが特定の操作を行った場合(たとえば、実際にチェックアウトプロセスを開始した後にもう少し数分を与えるなど)、バンプすることを検討してください。

    何かが利用可能かどうかをテストする場合は、locked_untilが過去かどうかを確認するだけです。このようにして、猶予期間が経過するとロック列をリセットする必要はありません。

    同じ製品の複数のインスタンスが(すなわち、このトレーナーの5の在庫があります)がある場合は、

    があるかもしれない。すなわち、あなたはまだ、実際の物理オブジェクトを表し第2のモデルを持っていることによって、このアプローチを使用することができますが
    class Product < AR:Base 
        has_many :physical_objects 
    end 
    

    およびPhysicalObjectのインスタンスは、(理想化されたオブジェクトではなく)実際のアイテムを表します。あなたは5つのスエットシャツを持っているので、スエットシャツ製品は5つの物理的な物体を持っています。 PhysicalObjectは、アイテムごとに異なるかもしれないもの(例えば、それが入っている倉庫)を追跡することもできます。

    ロッキングカラムが物理的なオブジェクトに座っています。商品をカートに追加すると、その商品の物理的なオブジェクトの1つがロックされます。注文が確定したら、物理的なオブジェクトを永久に消失させることができます削除することさえできます)。以前と同じロック戦略を使用する場合は、ロックをクリアするためにスイープタイプのタスクを実行する必要はありません。何をするにしても

    、あなたはおそらく2人の顧客がすごい

    +0

    これはSuryaの答えとどう違うのですか?また、PhysicalObjectは、おそらくあまり有用ではないでしょう。これは、中古のサイトであるためです(実際には、各アイテムの1つだけであり、倉庫はありません)。 – varatis

    +0

    古いロックを期限切れにするために定期的なチェックを行う必要がない点が異なります。あなたが各項目のうちの1つしか持っていないなら、答えの前半にアプローチすることができます。 –

    +0

    はい、それは意味があります。 – varatis

    関連する問題