Node.js NodeJs中基于时间的应用建模

Node.js NodeJs中基于时间的应用建模,node.js,Node.js,我正在开发一个拍卖风格的网络应用程序,在这个程序中,产品可以在一段时间内使用 我想知道你将如何建模 到目前为止,我所做的是在DB中存储产品: { ... id: p001, name: Product 1, expire_date: 'Mon Oct 7 2013 01:23:45 UTC', ... } 每当客户请求该产品时,我都会测试*current\u date

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

我想知道你将如何建模

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

{
...
id: p001,
name: Product 1,
expire_date: 'Mon Oct 7 2013 01:23:45 UTC',
...
}
每当客户请求该产品时,我都会测试*current\u date 如果为true,则显示产品数据,客户端显示倒计时计时器。如果计时器达到0,我将禁用相关控件

但是,在服务器端,即使没有人请求该产品,也需要执行一些操作,例如,通知所有者其产品已结束

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

我曾想过每n分钟触发一次cron例程,但想知道您是否能想出更好的解决方案


谢谢大家!

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

我将使用类似这样的工具来处理跟踪主服务器进程以及使用其内置的cron功能运行定期任务。

一些想法:

  • expire\u date
    字段编制索引。如果您正在扫描超过某个日期的拍卖项目,您将需要进行扫描
  • 考虑添加第二个
    过期的
    (或
    活动的
    )字段,以便您还可以执行其他类型的非日期搜索(因为您总是可以并且无论如何都应该拒绝过期的拍卖)
  • 例如,假设您添加了第二个字段
    active
    ,您可以进一步将扫描限制为仅限于那些处于活动状态且过期的拍卖项目。考虑这些情况的复合指数。(例如,随着时间的推移,您将拥有更多不需要扫描的过期项目)
  • 是的,您应该添加一个定时任务,使用您最喜欢的技术扫描过期的拍卖。有很多方法可以做到这一点——您的基础架构将帮助您确定什么是有意义的
  • 如果可能,在内存中保留当前拍卖项目的本地缓存,以尽可能提高扫描效率。如果没有任何东西过期,就没有理由访问数据库
  • 同样,在从数据库检索时始终检查以确认项目仍然处于活动状态,因为很容易存在竞态条件,在检索以显示时过期的项目可能会过期
  • 您可能希望在数据库中存储状态电子邮件等的状态,以便正确处理任何服务器重启等 可能是这样的:

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