因此,我有一个用户数据库,其中有一个reminderTime
字段,该字段当前只是一个字符串,看起来像是一个UTC时间的07:00
。
将来,我将在reminderTime
中包含多个字符串,这些字符串将对应于用户应在何时接收通知。
因此,假设您登录了一个应用程序,设置了多个提醒,例如07:00
,15:00
,23: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>
所以基本上您可以理解,也许可以做得更好。
答案 0 :(得分:1)
除非您真的有很多用户,否则您可以在数据库中简单地创建一个类似于时间表的表,该表只是user_id | notify_at
记录的列表。然后,每1-5分钟运行一次定期任务,该任务将比较当前时间并选择所有记录,其中notify_at
小于当前时间。
如果要每天发送多个通知以忽略已发送的通知,请添加标记notified
。无需每天创建数千条记录,您可以每天重置一次该标志,例如在00:00 AM。
可以肯定的是,您的用户不会同时收到所有通知,因此延迟可能会很小。
您建议的解决方案非常好:)