在巨大的mongo项目上运行预定任务

时间:2020-09-08 14:01:37

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

我知道这可能是一个广泛的问题,但是我一直在尝试找到正确的方法来做到这一点,而且我似乎什么都没走。

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

{

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

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

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

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

所以我的问题是,

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

2-在NodeJS中运行Cron作业与在Google App Engine(无服务器实例)中运行Cron作业之间有什么区别吗?

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

任何方向将不胜感激。

1 个答案:

答案 0 :(得分:2)

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

为了实现可伸缩性,您可以使用cron启动Google Dataflow管道。使用此管道,您可以定义一个管道步骤,以针对与给定查询匹配的每个记录执行该步骤。数据流在处理规模时将增加工作人员的数量。

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

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

2-在NodeJS中运行Cron作业与在Google App Engine(无服务器实例)中运行Cron作业之间有什么区别吗?

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