2013-10-06 23 views
0

正在開發一個拍賣風格的web應用程序,其中產品可用於特定時間段。在NodeJs中建模基於時間的應用程序

我想知道你會如何模型。

到目前爲止,我所做的就是將產品存放在DB:

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

每當該產品,我測試* CURRENT_DATE < EXPIRE_DATE客戶端請求*。

如果爲true,則顯示產品數據,客戶端顯示倒數計時器。如果定時器達到0,我禁用相關控件。

但是,在服務器端,即使沒有人請求該產品,也需要執行一些操作,例如通知擁有者他的產品已經結束。

我可以在每個請求上掃描整個產品集合,但對我來說似乎很麻煩。

我想每隔n分鐘就用cron觸發一個例程,但想知道你是否可以考慮任何更好的解決方案。

謝謝!

回答

1

掃描每個請求上的整個集合聽起來像是處理時間的巨大浪費。

我會使用類似pm2的東西來處理跟蹤您的主要服務器進程以及使用其內置cron-like功能運行定期任務。

1

的幾點思考:

  1. 指數expire_date領域。如果您正在掃描比特定日期更早的拍賣項目,您就會想要。
  2. 考慮添加第二個字段,即expired(或active),以便您還可以執行其他類型的非日期搜索(因爲您總是可以,並且無論如何應拒絕已過期的拍賣)。
  3. 例如,假設您添加第二個字段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 }) 
相關問題