在事件发生 X 小时后安排工作的最佳方法是什么?
What is the best way to schedule a job X hours after an event occurs?
我们有一个用户可以上传内容的应用程序。我们必须 运行 在上传一段内容后恰好 N 小时进行作业。
我想知道根据此类事件安排作业的最佳方式是什么?
我们可以想到的一个选择是我们必须在数据库中保存一个记录上传发生时间的事件,并且 运行 每秒检查一次 table 以查看是否有任何事件是准确的N小时了?这似乎不是一个很好的解决方案。
目前我们正在将 node-Cron 用于应用程序中的其他作业,但这似乎不支持我们正在寻找的用例。我们也遇到了 agendaJS,但无法使其与 Typescript 一起使用。
您可以只使用 setTimeout()
设置事件发生后 N 小时的计时器。 Nodejs 对数以亿计的计时器非常有效,因此为每个计时器使用一个计时器没什么大不了的。
例如从现在开始设置 3 小时的计时器:
setTimeout(() => {
doSomething();
}, 1000 * 60 * 60 * 3);
要处理服务器重启的情况,您必须在每个项目 运行 它的工作时保存在数据库中,并记录工作何时 运行 以便在服务器重启时,您可以查询仍需要其工作的项目 运行 并在指定时间为每个项目设置一个计时器。
如果您对 nodejs 如何有效地处理无数个计时器感到好奇,它会将所有计时器放入一个排序的链表中。应该最快触发的计时器位于列表的开头。
作为 运行在 nodejs 中设置事件循环的过程的一部分,它会检查列表头部的计时器是否已到时间。如果是,它调用与该计时器关联的回调并将其从列表中删除。
当安排新的计时器时,它们会按排序顺序插入到链表中。这样一来,数百万个定时器就没有常规的 运行 时间惩罚,因为事件循环所做的只是检查链表的头部以查看是否已达到该定时器的定时器,而该操作并不关心如何许多计时器在链表中。
如果有数以万计的定时器,那么在安排定时器时会产生轻微的额外成本,因为将新定时器插入列表中正确排序的位置需要稍长的时间,但这通常不是问题,因为这是每个计时器的一次性成本。请注意,任何计划工具都会有一些设置计时器的初始成本。
我们有一个用户可以上传内容的应用程序。我们必须 运行 在上传一段内容后恰好 N 小时进行作业。
我想知道根据此类事件安排作业的最佳方式是什么?
我们可以想到的一个选择是我们必须在数据库中保存一个记录上传发生时间的事件,并且 运行 每秒检查一次 table 以查看是否有任何事件是准确的N小时了?这似乎不是一个很好的解决方案。
目前我们正在将 node-Cron 用于应用程序中的其他作业,但这似乎不支持我们正在寻找的用例。我们也遇到了 agendaJS,但无法使其与 Typescript 一起使用。
您可以只使用 setTimeout()
设置事件发生后 N 小时的计时器。 Nodejs 对数以亿计的计时器非常有效,因此为每个计时器使用一个计时器没什么大不了的。
例如从现在开始设置 3 小时的计时器:
setTimeout(() => {
doSomething();
}, 1000 * 60 * 60 * 3);
要处理服务器重启的情况,您必须在每个项目 运行 它的工作时保存在数据库中,并记录工作何时 运行 以便在服务器重启时,您可以查询仍需要其工作的项目 运行 并在指定时间为每个项目设置一个计时器。
如果您对 nodejs 如何有效地处理无数个计时器感到好奇,它会将所有计时器放入一个排序的链表中。应该最快触发的计时器位于列表的开头。
作为 运行在 nodejs 中设置事件循环的过程的一部分,它会检查列表头部的计时器是否已到时间。如果是,它调用与该计时器关联的回调并将其从列表中删除。
当安排新的计时器时,它们会按排序顺序插入到链表中。这样一来,数百万个定时器就没有常规的 运行 时间惩罚,因为事件循环所做的只是检查链表的头部以查看是否已达到该定时器的定时器,而该操作并不关心如何许多计时器在链表中。
如果有数以万计的定时器,那么在安排定时器时会产生轻微的额外成本,因为将新定时器插入列表中正确排序的位置需要稍长的时间,但这通常不是问题,因为这是每个计时器的一次性成本。请注意,任何计划工具都会有一些设置计时器的初始成本。