在特定时间向用户发送多个通知

时间:2019-04-01 23:19:43

标签: node.js redis scheduled-tasks

因此,我有一个用户数据库,其中有一个reminderTime字段,该字段当前只是一个字符串,看起来像是一个UTC时间的07:00

将来,我将在reminderTime中包含多个字符串,这些字符串将对应于用户应在何时接收通知。

因此,假设您登录了一个应用程序,设置了多个提醒,例如07:0015:0023:30,并将其发送到服务器。服务器会将这些文件保存在数据库中并运行任务,并先从07:00发送通知,然后再从15:00发送通知,依此类推。因此,后来用户决定不再希望在15:00接收通知或将其更改为15:30,我们应该对此进行调整。

每个用户都有一个时区,但是我想因为reminderTime已经在UTC中,所以我可以创建一个任务而无需查看时区。

目前,我有一个reminderTime作为number,并且在客户向我发送07:00之后,我将其转换为秒,但是据我所知,我可以更改它并坚持使用{{1} }。

我所有的任务都在string队列库和Bull下运行。因此,据我所知,最好的可伸缩方法是采用Redis并在给定时间每天创建通知,然后运行任务,唯一的问题是我应该将它们保存到数据库中或向其中添加任务reminderTime中的队列。多次都会如此。

我不知道如何更改Bull中已经创建的任务,以使时间有所不同,依此类推。

也许我可以创建大约1000条记录,而此时用户应该会在我的数据库中收到一条通知。然后,我创建一个可重复的作业,该作业将每5分钟运行一次,并接收应在接下来的几个小时内发送的所有通知,然后将它们添加到Bull队列中,并将其标记为已发送。 / p>

所以基本上您可以理解,也许可以做得更好。

1 个答案:

答案 0 :(得分:1)

除非您真的有很多用户,否则您可以在数据库中简单地创建一个类似于时间表的表,该表只是user_id | notify_at记录的列表。然后,每1-5分钟运行一次定期任务,该任务将比较当前时间并选择所有记录,其中notify_at小于当前时间。

如果要每天发送多个通知以忽略已发送的通知,请添加标记notified。无需每天创建数千条记录,您可以每天重置一次该标志,例如在00:00 AM。

可以肯定的是,您的用户不会同时收到所有通知,因此延迟可能会很小。

您建议的解决方案非常好:)