在每天为每个用户随机生成的日期时间上执行函数



一个有趣的难题。以下是我想做的:

我在Heroku上运行了一个金字塔(python 2.7.2(网站,该网站向我的iPhone应用程序用户推送通知。每天,每个用户都需要在上午 10:00 到晚上 10:00 之间随机生成的时间向他们发送推送通知(显然也需要知道用户的时区(。

我目前的计划如下:使用持久工作进程每 1 分钟触发一次函数。每分钟,它将调用一个函数(在不同的线程上,以免中断计时器(,该函数将执行 2 件事:

    检查每个时区
  1. 是否是晚上 11:00(每天 24 次,每个时区一次(。如果为 true,它将调用一个函数,该函数遍历相应时区中的每个用户并生成第二天的随机时间,然后将其存储在 Mongo 数据库中。

  2. 每一分钟,工作人员还将循环访问用户并检查他们是否在那时收到通知。如果到期,请发送通知。

我的问题是:有没有更好的方法来做到这一点,不需要每天提前生成大量的随机日期时间列表?

当然还有其他方法。他们是否更好是另一回事。例如:假设距离给定用户的一天结束还有 n 分钟,他们还没有收到通知。然后现在向他们发送概率为 1/n 的通知。这样,你不需要大量的随机日期时间列表,但每分钟你仍然需要遍历所有用户,看看他们是否已经收到通知,并计算他们的随机数。总共计算量要多一点(尽管我怀疑差异是否显着(,这意味着您的所有数据库更新都很小。

或者:每次通知用户时,都会生成用户的下一次更新时间。这样,下一次更新时间将以增量方式计算,但仍会提前知道。

(如果你的用户数量相对较小,所以在大多数分钟没有通知,你可以让调度更智能 - 但我不会多说,因为如果你的用户很少,那么你的软件需要做的工作量无论如何都可以忽略不计,在这种情况下进行优化是没有意义的。

下面是一些伪代码:

Once per PERIOD (e.g. 1 minute) in the RANGE:
    Let NOTECOUNT be the number of users needing notification
    Let FRACTION be the length of the RANGE divided by the PERIOD
    Notify FRACTION of users (either first N or randomly chosen)
    Update notified user records with the notification time
At the end of each RANGE:
    Notify all users whose last notification time is at least 24 hours ago
关于

如何处理多个时区,没有明确的规定;您可以简单地考虑每个支持的时区都需要上述过程的一个"实例",并且每个时区中的用户列表将是每个实例中的候选列表。 两个潜在的问题是用户可能会更改时区,而时区很糟糕,因此有时可能会出现两次(例如,当 DST 更改时(,因此您应该考虑这一点。

最新更新