在NodeJ中建模基于时间的应用程序

时间:2013-10-06 17:54:03

标签: node.js

我正在开发一种拍卖风格的网络应用程序,产品可以在一段时间内使用。

我想知道你会如何建模。

到目前为止,我所做的是将产品存储在DB中:

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

每当客户端请求该产品时,我都会测试* current_date< EXPIRE_DATE *

如果为true,我会显示产品数据,并在客户端显示倒数计时器。如果计时器达到0,我将禁用相关控件。

但是,在服务器方面,即使没有人请求该产品,仍有一些操作需要完成,例如,通知所有者他的产品已经结束。

我可以根据每个请求扫描整个产品系列,但对我来说似乎很麻烦。

我想过每隔n分钟用cron触发一次例程,但想知道你是否可以考虑任何更好的解决方案。

谢谢!

2 个答案:

答案 0 :(得分:1)

在每个请求上扫描整个集合听起来像是浪费处理时间。

我会使用pm2之类的东西来处理跟踪主服务器进程以及运行具有内置类似cron功能的周期性任务。

答案 1 :(得分:1)

一些想法:

  1. expire_date字段编制索引。如果您正在扫描超过特定日期的拍卖品,您会想要。
  2. 考虑添加expired(或active)的第二个字段,这样您也可以进行其他类型的非日期搜索(因为您可以随时拒绝已过期的竞价) )。
  3. 假设您添加了第二个字段active,您可以进一步将扫描限制为仅处于活动状态且超过截止日期的拍卖项目。考虑这些案例的复合指数。 (随着时间的推移,您将有更多过期的项目,例如您不需要扫描)。
  4. 是的,您应该使用自己喜欢的技术添加定时任务,以扫描过期的拍卖。有很多方法可以做到这一点 - 您的基础架构将有助于确定有意义的内容。
  5. 如果可能,请将当前拍卖项目的本地缓存保留在内存中,以尽可能提高扫描效率。如果什么都没有到期,没有理由打到数据库。
  6. 同样,请始终检查何时从数据库中检索以确认项目仍处于活动状态 - 因为在检索显示时过期的项目可能会过期的竞争条件很容易。
  7. 您可能希望在数据库中存储状态电子邮件等状态,以便正确处理任何服务器重新启动等。
  8. 可能是这样的:

    {
    ...
    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 })