【问题标题】:NodeJS run code in X minutes architectureNodeJS 在 X 分钟架构中运行代码
【发布时间】:2015-06-01 04:11:26
【问题描述】:

我想安排一些代码在可变时间运行。例如,在 60 分钟后,我想向端点发送 HTTP 请求并更新数据库文档,但我还希望能够在 60 分钟之前发生操作时取消该代码的运行。

构建这个的最佳方法是什么?我希望它能够在服务器重新启动后仍然存在,并且如果我的应用程序跨多个服务器扩展,它也能正常工作。

谢谢!

【问题讨论】:

  • 如果您要跨多个服务器进行扩展,那么您将需要一些代理来协调哪个服务器正在为定时活动执行什么操作。有许多不同的可能方法,由于您几乎没有提供有关您实际在做什么的详细信息,因此很难提出具体的建议。您可以执行任何操作,从 cron 作业到管理工作队列并将任务分发给其他服务器的自定义服务器,再到让服务器直接从共享数据库获取工作项。
  • @jfriend00 谢谢,只是需要一些指导。现在研究 kue。

标签: node.js mongodb architecture cron queue


【解决方案1】:

您将为此使用setTimeout() 并保存它返回的计时器ID,因为您可以使用该计时器ID 取消计时器。要安排计时器:

var timer = setTimeout(myFunc, 60 * 60 * 1000);

然后,在计时器触发之前的某个时间,您可以取消计时器:

 clearTimeout(timer);

如果您想在服务器重新启动后仍然存在,那么您还需要将您希望计时器触发的实际系统时间保存到某个持久性存储(如磁盘或数据库上的配置文件)。然后,当您的服务器启动时,您从持久存储中读取该值,如果已设置,则设置一个新的setTimeout(),该值将在那时触发。同样,当计时器触发或由于不再需要计时器而清除计时器时,您将更新持久存储,以便不再存储未来的时间。

您可以通过创建一个persistentTimer 对象来使这一切变得相当干净,该对象具有设置计时器的方法,清除计时器并在服务器重新启动时从您正在使用的任何持久存储进行初始化。

【讨论】:

  • 如果我的应用程序跨多个服务器扩展怎么办?如果应用程序在多个服务器上启动,它会在服务器之间复制 setTimeouts。很抱歉没有在原始帖子中提及这一点。我会更新的。
  • @timmyg13 - 你期待什么答案?您显然必须决定哪台服务器将为该特定活动提供服务。包括问题的多服务器部分,而没有任何关于其工作原理或活动是什么的详细信息,这会使您的问题过于宽泛,无法提供任何具体答案。而且,是的,编辑您的问题以包含这一事实完全改变了整个问题,现在甚至没有足够的细节来知道什么是合适的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 2019-11-04
  • 1970-01-01
  • 2017-09-26
相关资源
最近更新 更多