繁体   English   中英

使用 mongoDB 发送提醒的最佳方式是什么?

[英]What is the best way to send reminders with mongoDB?

我想提醒用户他们需要削减。 间隔基于用户设置。 每次用户安排约会时,我都会更新时间戳。

Users架构如下所示:

Users:{
    reminder:{
        [BarberID1]:{
            interval:2, //in days
            lastScheduled:1609090071 // timestamp when the user has scheduled an a appointment last time
            }
        },
        [BarberID2]:{
            interval:2, //in days
            lastScheduled:1609090071 // timestamp when the user has scheduled an a appointment last time
            }
        }
    }
}

目前,我每天使用 cronjob 获取每个User一次,并检查每个用户是否需要发送提醒通知。

我不确定这个解决方案是否可扩展,所以我想我会在这里提出一个问题。

假设我有 10 万用户,每个用户至少有 3 个理发师。

谢谢!

PS:我在某处看到了mongoDB TTLchange streams的可能解决方案,但我不想在发送提醒后删除用户。

我会说没有太多细节:这几乎就是你这样做的方式。 当涉及到迭代所有用户(即使你有 100 k)时,你会惊讶于这个操作的速度有多快,但是“速度”在这里并不是真正的问题,所以如果这个操作需要 20 秒,它仍然不应该不是问题。 没有人等着看屏幕等结果,这是一个后台任务。

当然,您如何确定需要通知哪些用户可能会有所不同。 对可扩展性的需求取决于,例如,如果您真的 go 通过所有用户逐个访问,或者您是否使用某种过滤方法。

真正的问题

真正的问题是“通知”部分。 可扩展性在这里更为重要,因为您希望及时发送所有通知。 我会:

  • 将“发送”通知的部分外包到单独的 API 和
  • 在批处理选项中包含队列功能

我建议的是,您应该创建一个包含通知详细信息的单独集合,其中包含两个主键“ notification_trigger_date ”和“ user_id ”以及这两个键的组合索引“ notification_trigger_date_user_id_1 ”。

"notification_log_collection": {
  "notification_trigger_date": "2020-12-31",
  "user_id": "",
  "extra_info":{
    "any_details_here":{}
  }
  
}

现在要在您的 crontab 中获取符合条件的用户,您只需在“notification_trigger_date”集合中查询,获取用户并发送通知。

这种设计的一些优点:-

  1. 您将从数据库中仅提取符合条件的用户。
  2. 您可以保留与该通知对应的日志。
  3. 在此集合中添加一个 TTL,可能是“notification_trigger_date + 15 天”
  4. 可扩展到任意数量的用户,无论是 1M 还是 10M

这里要注意的一件事是,如果用户输入更改了“间隔”键,则必须在此集合中删除并创建一个新文档。

您可以考虑将 barder_id 保留在上述集合中,这是您的选择。

“FAN OUT”这里的概念是在写入时进行处理并使您的数据库调用变得简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM