【问题标题】:Scheduling a repeated HTTP request using NodeJS使用 NodeJS 调度重复的 HTTP 请求
【发布时间】:2019-05-17 23:08:50
【问题描述】:

在我的 Node 应用程序中,我需要安排每周一次的 API 请求以从第三方网站获取一些数据。我有 1000 名用户在他们的帐户中设置了多个时间表。

我能够使用node-cron 编写一个重复的计划函数。但是随着应用程序的扩展和用户数量的增加,我不认为 Cronjobs 是解决这个问题的更好方法。

还有其他方法可以实现我的最终目标吗?

【问题讨论】:

  • 您当前使用的是哪个数据库?
  • 我正在使用 MongoDB
  • 好的。美好的。您是否尝试过调度 API 的议程?
  • 不,你能分享任何可以指导我的链接吗?

标签: node.js cron scheduled-tasks


【解决方案1】:

这是一个开放式问题,但让我建议一些潜在的设计方法。

假设您有很多用户,每个用户都有很多计划,并且每个计划都有一个时间规范(cron 格式或其他):与每个计划一起存储计划最后一次运行的时间。创建一个“作业”(任务、程序等),在运行时循环所有用户并评估他们的计划:对于每个计划,使用上次运行时间和他们的时间规格来计算下一个计划运行时间,如果当前时间等于或超过该时间,则将调度添加到列表中。然后遍历列表,运行每个调度(无论需要什么),并更新上次运行时间。

通过以这种方式构建您的工作,您可以选择是否使用 cron。您可以每天手动运行该程序一次,您可以安排它在您的主应用程序服务器上每 60 秒运行一次(可能对于许多运行它会退出而不做任何事情,因为没有更多用户有需要运行的时间表)。我认为系统 cron 对于安排此类任务仍然有用,但这取决于您。

在规模上(假设您最终有 100,000 个用户,每个用户有 1-5 个计划),我建议使用基于作业的排队系统。使用 node-resque 之类的东西,您可以使用 cron 每 5 分钟启动一次调度检查器作业,这将为每个需要运行的调度添加单独的运行调度作业 .最终,您将有太多用户无法在单个时间表检查器中进行评估; schedule checker 作业 可以修改为只计算您的用户,对他们进行分片,然后启动较小的 schedule checker 作业(一个用于用户 1-5000,一个用于用户 5001- 10000 等)。这将允许您向外扩展并利用 5 或 10 或 15 个 resque worker。

(我建议使用 resque,因为我是 redis 的粉丝,但您也可以轻松地使用另一个队列系统,或者甚至,如果您在生产中使用 Jenkins,一系列 Jenkins 工作相互启动并使用 Jenkins工人机器来运行作业。这是以这种方式构建跑步者的优势,您可以将其映射到几乎任何技术上。)

您仍然需要解决很多挑战:如果所有这些调用都针对一个远程 API,您将必须检测并处理远程 API 过载和出现速率限制错误(这可能会影响您的规模有多大)如果决定向外扩展,那么每秒向远程服务器支持 1,000 个请求是没有意义的,如果它限制您每秒 5 个请求)。您还需要考虑如果发生故障并且您在几个小时内没有运行作业会发生什么(取决于您的应用程序,您是否希望您的用户的时间表“赶上”并比每个预定运行的预期运行时间晚,或者它应该“跳到”最新时间并忽略丢失的时间)。其他细微差别包括计划在运行队列中被用户删除或更改等。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2015-09-06
    • 2019-01-27
    相关资源
    最近更新 更多