【问题标题】:Cron-job - send email [x] days/hours before date - users can choose [x]Cron-job - 在日期前 [x] 天/小时发送电子邮件 - 用户可以选择 [x]
【发布时间】:2017-02-03 03:57:54
【问题描述】:

我正在构建一个 Meteor.js 应用程序,其中事件显示在日历中。

部分功能是应用程序会在活动发生前通过电子邮件自动提醒用户。有一个固定的提醒期(比如 3 天左右),这很容易,但我需要构建一个用户可以选择通知间隔的系统。所以可能是 3 天、7 天、3 小时、24 小时等。

我可以设置一个 cron 作业来搜索事件集合并检查是否为 event date - 3 days > current date,然后 ping 一个通知,但如果每个用户都有自定义间隔,我不确定如何制作这个 cron 作业。

我现在正在考虑处理它的方式是使用两个值保存事件:datereminderDate。当事件被保存到数据库时,reminderDate 是根据用户选择的时间间隔计算的。然后,如果他们将提醒设置从 24 小时更新为 1 周,则会执行一项操作,更新他们所有事件的reminderDate

上述解决方案的问题在于,如果他们在数据库中有数百或数千个事件,那可能是一个非常长的操作,需要相当长的时间才能完成。一定有更好的办法吗?

任何有关如何处理此问题的建议将不胜感激!

【问题讨论】:

    标签: javascript meteor cron


    【解决方案1】:

    有几种方法可以解决这个问题,最好的方法可能只是一个意见问题,尤其是在没有关于事件数量、用户数量和用户更新他们的频率的更多信息的情况下通知偏好。

    如果用户只很少(典型)更新此偏好,那么您存储通知日期的方法是合适的。您只需更新未来的事件,而不是过去的事件,这样可以减少更改的范围。

    如果可能的提醒间隔数量有限,则另一种方法就足够了。在您的示例中,您有 24 小时到一周的时间。假设我们说可能的间隔是:

    const intervals = [1,2,3,4,5,6,7]; // days
    

    然后在您的 daily cron 作业中,您可以迭代这些时间间隔并查找与 now + 时间间隔匹配的任何事件并在这些事件上发出警报。

    let start = new Date();
    intervals.forEach(interval => {
      const end = start.setHours(start.getHours()+24*interval);
      Events.find({date: {gte: start, lt: end}}).forEach(event => {
        // send notification for each event in the interval
      });
      start = end; // move the start time to the beginning of the next interval
    });
    

    【讨论】:

    • 嗨,迈克尔,感谢您的回复 - 非常感谢!不会有那么多间隔、事件或用户,我认为用户不会经常更改间隔。然后我可能会选择第一个选项。在过去的几个小时里,尽管有人建议为每个用户在更新间隔设置时创建一个单独的 cronjob 的概念。这意味着我不需要在文档中保存需要发送通知的日期。你知道这是否可能/一个好主意吗?
    • 每个用户一个 cron 作业很有趣,但您必须处理应用服务器重启的情况。
    • 嗨 Michel,你的意思是 cron 作业在服务器重新启动时被擦除?
    • afaik with synced-cron,是的。
    猜你喜欢
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多