【问题标题】:Send multiple notifications to a user on specific time在特定时间向用户发送多个通知
【发布时间】:2019-08-23 04:40:04
【问题描述】:

所以我有一个用户数据库,其中有一个 reminderTime 字段,当前只是一个字符串,看起来像 07:00,这是一个 UTC 时间。

将来我将在reminderTime 中包含多个字符串,这将对应于用户应该收到通知的时间。

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

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

目前我有一个reminderTime 作为number,在客户给我发送一个07:00 后,我将其转换为秒,但据我所知,我可以更改它并坚持使用string

我的所有任务都使用Bull 队列库和Redis 运行。因此,据我了解,最好的可扩展方法是采用reminderTime 并在给定时间为每天创建通知并运行任务,唯一的问题是我应该将它们保存到我的数据库中还是将任务添加到队列中在Bull。多次相同。

我不明白我应该如何更改Bull 中已经创建的任务,以便时间不同等等。

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

所以基本上你明白了,也许它可以做得更好一点。

【问题讨论】:

    标签: node.js redis scheduled-tasks


    【解决方案1】:

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

    添加标志notified,如果您想每天多次发送通知以忽略已发送的通知。无需每天创建数千条记录,您只需每天重置一次该标志,例如上午 00:00。

    您的用户不会同时收到他们的通知,这没关系,可能会有一点延迟。

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

    【讨论】:

    • 假设我有很多用户,那么我应该如何处理以及会发生什么变化?
    • 我可以想象,在某个时刻,您将无法处理所有用户,直到您需要发送另一个通知(例如,您在 13:00 第一次发送,下一个在13:01,有一分钟时间通知您的所有用户)。好吧,您可以使用并行运行的队列来扩展它,一次占用一些小块用户。具体名称我不会帮你,因为我对 Node 和 Bull 不太熟悉,但如果你有一些 PHP 后端,你可能可以使用 RabbitMQ 来实现
    • 我想做一些事情,比如我在 Postgres 中为下个月创建通知,然后我将队列作业与 Redis 或 RabbitMQ 一起使用,我将在其中获得当前日期并添加一天。然后我将运行 Postgres 查询以获取我需要在该日期范围内向其发送通知的所有用户,然后我将为它创建作业并设置一个标志,表明它已发送或类似的东西。然后我希望我不会遇到这个问题,直到某个时刻。
    猜你喜欢
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    相关资源
    最近更新 更多