crons是Web应用程序的重要组成部分,从自动发票,触发每周通知或触发搜索reindex或数据备份。
本文涵盖Crons 陷阱 (窗口,监视,警报)以及部署和托管解决方案的广泛列表。
与Crons合作
cron,通过在后台运行,面临多个挑战。
首先,警报和监视工具为API设置的设置不适用于长时间在单独过程上运行的CRON执行,并且可能会默默失败。<<<<。 /p>
Sentry最近发布了Sentry Crons,该Sentry Crons可以帮助轨道是否按预期的运行,并且发生任何错误;但是,我们会看到它需要一些设置和自定义错误处理,就像许多自托管设置一样(例如:在捕获异常时推到松弛,然后如何处理OOM < /strong>错误?)。
最后,部署和运行CRON带来了许多技术挑战:
调度精度
您的克朗需要在特定的时间运行,但是您可以容忍几秒钟的延迟吗?
另外,您能否容忍一些您的某些Cron发生?
您对这些问题的回答将确定哪种托管解决方案最适合您的用例。
窗口/固定执行和执行堆叠问题
crons(例如数据导出或每周通知)往往会随着时间的流逝而缓慢运行,与已处理的数据或已发送通知成比例。您如何确保多个执行事件不会彼此重叠?您是否应该按固定时间表或相对于其他事件进行运行?
我们将看到利用的机制以及某些托管解决方案如何阻止执行堆叠。
cron频率限制
您的克朗需要多久运行一次?
大多数解决方案将允许最小发生1-10分钟;但是,很少有人允许在1分钟以下复发。
长期运行的Crons
cron运行越长,资源问题的兴起(例如:内存),先前涵盖的执行堆叠问题和监视问题就越难管理(例如:您是否具有实时日志访问来识别长时间 - 绑架与卡住执行?)。
我们将通过对上述技术和工具标准进行评估来介绍众多的node.js crons部署方法。
设置和部署node.js crons
自助主持人一个开源库
npm托管一些出色的开源节点。 BullMQ,带有REDIS的调度程序;和议程。
简而言之,议程通过将工作持续到磁盘(通过mongoDB)提供了更具弹性的方法。另一方面,node-cron
是最简单的设置,而无需数据库/存储。
这三个都要求为您的项目创建一个专用的入口点,以使工人开始。另外,它们提供了该软件,但给您提供托管选择。
在Heroku或process on Fly上的专用Dyno将是最简单的解决方案,用于在几分钟内为Node.js Crons部署node-cron
,BullMQ或议程。
PROS&CONS
使用部署在Heroku或Fly.io的免费层上的免费开源库是成本效益。
此外,BullMQ也提供窗口式的crons,即使在执行长期执行的情况下也无法重叠,而议程则具有最佳的日程安排在市场上的频率,一个5秒的最小cron频率(取决于您的MongoDB设置和活动数量)。
但是,您需要花费时间向handle errors manually(例如:带有哨兵),设置适当的警报,并部署BullMQ和议程提供的仪表板(缺乏对实时日志的支持持续执行)。
最后,您可能必须管理与自托管相关的频繁问题:与长期运行的CRON相关的内存问题,数据库重新连接和连接汇总策略,优雅的关闭和CRON版本。 P>
结论
自托管的开源库方法与非企业必不可少的用例有关(例如,任何失败都没有财务影响)或具有DevOps的软件工程师。
现在让我们看一下托管node.js crons解决方案。
由UI配置的托管Node.js Crons
许多解决方案提供了直接从UI配置CRON的解决方案:
渲染和Heroku将使您能够配置命令以从仪表板以给定频率运行,并保证在任何给定时间只有一次发生。
请注意,Heroku调度程序is eventually reliable和仅支持预定义的调度值(每小时10分钟,每天,每天)。
PROS&CONS
Heroku调度程序和渲染Cron Jobs使易于快速在现有脚本上快速设置Cron 而无需任何部署或代码更改。
两者都需要一个付费帐户(渲染最低$ 1/mo $ 1/mo,Heroku最低$ 5/mo)和Will Will 需要一些时间投资 set up proper error handling,提醒和监视,如果用于更关键的用例(例如:停用过期的免费试用帐户)。
结论
Heroku调度程序和渲染Cron Jobs是快速设置CRON的绝佳解决方案,以使非关键的现有快速脚本自动化需要低监控(例如:在Slack Daily上发布报告)。
现在让我们介绍从代码配置的托管node.js crons解决方案的两种方法。
无服务器Node.js Crons(Vercel,NetLify)
Netlify于2022年发布了Scheduled Functions,Vercel最近发布了Vercel Cron Jobs,允许开发人员在其应用程序的代码中直接定义Cron Jobs:
{
"crons": [
{
"path": "/api/cron",
"schedule": "0 5 * * *"
}
]
}
PROS&CONS
Vercel和Netlify的方法通过允许Cron函数生活在应用程序中,并从代码中版本中受益,从而带来了更好的开发人员体验。
但是,无服务器约束应用于您的CRON :最大执行时间为1分钟至15分钟(在付费计划上),连接池问题的高分子方案以及缺乏对本机依赖关系的支持(例如:PDF文档生成所需的)。
结论
既是在Beta,Vercel和Netlify Cron产品中都可以使用不计算密集型并且不需要本机依赖性的轻巧操作或产品自动化的绝佳解决方案(例如:更新条纹订阅数量,结束电子邮件和松弛通知)。
它绝对为无服务器应用程序提供了Node.js Crons上的最佳统一开发器体验。
托管node.js crons
受Framework-defined infrastructure Vercel原理的启发,Defer为所有类型的Node.js Applications ,从Serverless到Monolith,从Express.js提供了所有类型的node.js应用程序:
import { defer } from "@defer/client"
const weeklyBrief = async () => {
// ...
}
export default defer.cron(
weeklyBrief,
"5 0 * * *"
)
PROS&CONS
您可以从您的整体上的Vercel等平台的开发人员体验中受益从轻巧到关键(例如:文档或图像处理,数据密集型任务)。
另外,您可以通过transforming them into workflows缩放您的Cron,并利用延期控制台的指标,日志和警报。
当然,使用延期意味着要处理2个PAA,一个用于您的应用程序(例如:Vercel或Heroku),一个用于您的背景操作。尽管如此,leveraging the Doppler integration可以放松它。
结论
作为一个托管Node.js Cron解决方案,Defer是开发人员和独立黑客寻找快速市场上市时间的绝佳匹配,同时选择可靠的解决方案,该解决方案将为所有CRON用例,甚至关键。 P>
node.js crons备忘单
轻巧的cron用例可以使用开源和自托管组合来设置和部署,以便为愿意管理自己的服务器的开发人员组合。
处理轻量级CRON的另一种方法,尤其是在现有脚本上,是利用UI Crons解决方案,例如渲染Cron Jobs和Heroku Scheduler。
另一方面,愿意在Vercel或Netlify上保持统一体验的开发人员可能想使用其Cron产品。
但是,为了从最佳开发人员体验和所有堆栈中的托管解决方案中受益,defer是编写弹性node.js cron的最快方法。面临多重挑战。