0

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

我想知道你会如何建模。

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

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

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

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

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

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

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

谢谢!

4

2 回答 2

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 })
于 2013-10-06T18:51:48.000 回答
1

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

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

于 2013-10-06T18:13:59.283 回答