前言
Serverless 架构已经成为当下互联网应用开发的热门选择,因为 Serverless 能带来更快的开发速度、便捷的运维、更实惠的成本以及更好的弹性伸缩性。
然而,在使用 Serverless 架构开发应用时,我们往往需要实现一些周期性执行的任务。这些任务可能是数据备份、报表生成、批量处理等等。因此,如何在 Serverless 架构下实现这些周期性任务的时间调度就成为一个不可忽视的问题。
本文将介绍在 Serverless 架构下时间调度的解决方案,并提供示例代码和指导意义。
方案一:使用定时触发器
AWS Lambda、Azure Function 和 Google Cloud Functions 都提供了定时触发器(Scheduled Event)。这种方案适用于时间调度任务的频率比较低(如每天或每周执行一次)。
AWS Lambda 示意图
Azure Function 示意图
Google Cloud Functions 示意图
如上图所示,在这种方案下,我们只需要在云厂商的控制台上设置定时触发器的时间和执行的函数即可。
下面是一个使用 AWS Lambda 的 Node.js 代码示例:
exports.handler = async (event) => { console.log('Hello, world!'); };
在 AWS Lambda 控制台上,我们可以按照如下步骤设置定时触发器:
在代码编辑器中点击
Add trigger
。选择
CloudWatch Events
。配置触发器的时间表达式,例如每天早上 8 点钟执行一次。
配置执行函数名称和相关配置,然后保存并部署代码。
注意事项
在定时触发器执行的 Lambda 中需要添加错误处理来防止因为错误而使定时器失效。
定时触发器的时间表达式需要遵守时间表达式规范。
方案二:使用外部定时器
有时我们需要更为复杂的时间调度任务,这些任务可能需要在不同的时间和频次下执行。在这种情况下,我们可以使用一个外部定时器来触发我们的 Serverless 函数。
目前市场上有许多成熟的云托管定时服务(如 AWS EventBridge、Azure Logic Apps、IFTTT 等),这些定时服务能够执行定时任务,而且方便易用、功能强大。
AWS EventBridge 示意图
Azure Logic Apps 示意图
IFTTT 示意图
如上图所示,在这种方案下,我们只需要设置定时触发器的时间、执行的函数和其它相关参数,然后交给定时服务即可。
下面是一个使用 AWS Lambda 的 Node.js 代码和 AWS EventBridge 的示例:
exports.handler = async (event) => { console.log('Hello, world!'); };
在 AWS EventBridge 控制台上,我们可以按照如下步骤设置定时触发器:
创建一个规则(Rule),并为该规则指定时间表达式和目标对象。
目标对象为 Lambda 函数,设置执行的函数名称和其它相关配置,然后保存并部署代码。
注意事项
在外部定时器执行的中间件中需要添加错误处理来防止因为错误而使定时器失效。
在使用外部定时器时,需要注意服务本身的价格及其它免费服务可能受到的限制。
总结
时间调度在 Serverless 架构的应用中扮演着重要的角色,因为它可以帮助我们自动化、优化一些任务,减轻繁杂的日常工作压力。上文介绍了两种不同的时间调度方案,通过它们的比较,我们可以明确在不同的场景下何时应该使用哪种方案。
Serverless 架构的优势在于它能将时间调度的任务向云服务外部数据处理平台转移,由云平台自动管理定时器,从而使我们更好地专注于业务逻辑的实现。在此基础上,我们也可以利用其它强大的云计算组件,如云存储、数据库等等,构建出更为完善、高效、安全、可靠的应用程序。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e0625ff6b2d6eab3b76432