【问题标题】:Run scheduled tasks on huge mongo items在大型 mongo 项目上运行计划任务
【发布时间】:2020-12-26 22:31:11
【问题描述】:

我知道这可能是一个宽泛的问题,但我一直在努力寻找正确的方法来做到这一点,但我似乎无处可去。

基本上,我在 mongo 中保存了一堆包含事件的对象,如下所示:

{

  "date" : "2020-09-09",
  "day" : 1599573600000 // epoch time
  "from" : 1599595200000 // epoch time
  "to" : 1599695200000 // epoch time
}

我需要在from 字段中指定的日期之前触发一些事件,例如发送提醒短信等。

我知道我可以编写一个 cron 作业并定期检查我的整个 mongo 集合,找到所有到期的,其余的都很明显。

但是,不知何故,我觉得一定有更好的方法,因为在我们的数据库随着数百万个事件而增长之后,这可能会非常缓慢。

所以我的问题是,

1- 除了 cron 作业之外,还有哪些其他选项。

2- 在 NodeJS 中运行 Cron 作业和在 Google App Engine(无服务器实例)中运行 Cron 作业有什么区别,哪个更好?

3- 有没有人用过的服务?

任何方向都将不胜感激。

【问题讨论】:

    标签: node.js mongodb google-app-engine cron


    【解决方案1】:

    我假设您正试图留在 GCP 生态系统中。

    为了可扩展性,您可以使用 cron 启动 Google Dataflow 管道。使用此管道,您可以为与给定查询匹配的每条记录定义要执行的管道步骤。 Dataflow 将在处理规模时增加工作人员的数量。

    如果您的规模不够大,Dataflow 可能会有点繁重,并且对于您当前的用例来说可能有点矫枉过正。如果是这种情况,那么您可以结合使用 cron 和谷歌云任务,您可以在其中为每条记录排队/启动一个任务。对于大量记录,您可以为每批记录启动一个任务(即注入器模式) https://cloud.google.com/tasks/docs/manage-cloud-task-scaling#large-scalebatch_task_enqueues

    另一种选择是使用谷歌云任务,使用'schedule_time' 字段。在这里,当您最初将记录写入数据库时​​,您会将任务排入队列,而不是定期查询以查看需要运行哪些任务 https://cloud.google.com/tasks/docs/creating-http-target-tasks

    2- 在 NodeJS 中运行 Cron 作业和在 Google App Engine(无服务器实例)中运行 Cron 作业有什么区别,哪个更好?

    我不确定您的第二个问题是什么意思,因为您可以在应用引擎中运行 node.js。根据我的经验,将所有内容都保留在 GCP 中会更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 2017-11-08
      • 2021-10-22
      • 1970-01-01
      相关资源
      最近更新 更多