0

商品が一定期間利用できるオークション スタイルの Web アプリを開発しています。

それをどのようにモデル化するのか知りたいです。

これまでのところ、私が行ったことはDBに製品を保存することです:

{
...
id: p001,
name: Product 1,
expire_date: 'Mon Oct 7 2013 01:23:45 UTC',
...
}

クライアントがその製品を要求するたびに、*current_date < expire_date* をテストします。

true の場合、製品データと、クライアント側でカウントダウン タイマーを表示します。タイマーが 0 になると、関連するコントロールを無効にします。

ただし、サーバー側では、誰もその製品を要求していない場合でも、実行する必要があるいくつかの操作があります。たとえば、所有者に製品が終了したことを通知します。

リクエストごとに製品のコレクション全体をスキャンできますが、面倒に思えます。

n分ごとにcronでルーチンをトリガーすることを考えましたが、より良い解決策を考えられるかどうか知りたい.

ありがとうございました!

4

2 に答える 2

1

リクエストごとにコレクション全体をスキャンすることは、処理時間の膨大な無駄のように思えます。

pm2メインサーバープロセスの追跡と、組み込みのcronのような機能を使用した定期的なタスクの実行の両方を処理するようなものを使用します.

于 2013-10-06T18:13:59.283 に答える
1

いくつかの考え:

  1. フィールドにインデックスを付けexpire_dateます。特定の日付より古いオークション アイテムをスキャンする場合に必要になります。
  2. expired(または)である 2 番目のフィールドを追加することを検討してくださいactive。これにより、他のタイプの日付以外の検索も実行できます (期限切れのオークションはいつでも拒否できますが、とにかく拒否する必要があります)。
  3. たとえば、 2 番目のフィールドを追加すると仮定すると、activeアクティブで有効期限を過ぎたオークション アイテムのみにスキャンをさらに制限できます。そのような場合の複合インデックスを検討してください。(時間の経過とともに、たとえば、スキャンする必要のない期限切れのアイテムが増えます)。
  4. はい、期限切れのオークションをスキャンするために、お気に入りの手法を使用して時間指定タスクを追加する必要があります。これを行うには多くの方法があります。インフラストラクチャは、何が理にかなっているのかを判断するのに役立ちます。
  5. 可能な限りスキャンを効率化するために、現在のオークション アイテムのローカル キャッシュをメモリに保持します。有効期限が切れていない場合、データベースにヒットする理由はありません。
  6. 繰り返しになりますが、データベースから取得するときは、項目がまだアクティブであることを確認するために常にチェックしてください。
  7. サーバーの再起動などが適切に処理されるように、ステータス電子メールなどの状態をデータベースに保存することができます。

それは次のようなものかもしれません:

{
...
id: p001,
name: "Product 1",
expire_date: ISODate("Mon Oct 7 2013 01:23:45 UTC"),
active: true,
...
}

// console
db.auctions.esureIndex({expire_date: -1, active: 1})

// javascript idea:
var theExpirationDate = new Date(2013, 10, 06, 0, 0, 0);
db.auctions.find({ expire_date : { "$lte" : theExpirationDate }, active: true })
于 2013-10-06T18:51:48.000 に答える