使用函数计算运行定时任务
上一篇博客提到我在使用 Dokploy 部署网站服务,但 Dokploy 不支持定时任务,于是只能创建普通服务,并在内部使用脚本定时执行命令。最近发现,将这些定时任务放在函数计算中执行可能是更好的选择。
我的服务都跑在阿里云上,下面介绍的也是阿里云函数计算。
创建函数
要创建一个函数,在阿里云函数界面后台,点击创建函数按钮即可,如下图所示:

在随后的界面中,选择“任务函数”类型。

然后,函数代码部分可根据需要选择类型,比如可以使用 ACR 中的 Docker 镜像。

需要注意的是,无论是上传代码还是使用 Docker 镜像,都要确保对应的代码能提供一个 HTTP 服务,因为定时任务执行的入口即是这个 HTTP 服务。
其他还有环境变量等配置,根据你的实际情况填写即可。
函数入口
使用函数计算的定时任务,需要你的代码提供一个 HTTP 服务,定时任务执行时,会以 POST 的方式请求 /invoke
路径,即类似下面这样的请求:
curl -X "POST" "http://localhost:8050/invoke" \
-H 'Content-Type: application/json' \
-d $'{
"payload": "YOUR_PAYLOAD",
"triggerName": "trigger-name",
"triggerTime": "2025-04-27T03:12:45Z"
}'
当然,真实的请求还有很多 HTTP 头信息。
你需要在代码中实现 /invoke
接口,并在其中执行定时任务。在函数计算后台,可以设置超时时间等属性。
注意其中的 payload
字段,后面在设置定时触发器时,可以自定义传入的 palyload
信息。
设置定时触发器
添加函数之后,即可在配置界面设置触发器。

函数计算支持多种触发器,在这儿,我们选择定时触发器即可。

其中最后一个字段“触发消息”,其中填写的内容即是上面 payload
参数的值。注意这儿传递的是普通字符串,而不是 JSON,收到之后可根据需要做一个解析。
如果你在同一个函数中有多个用途不同的触发器,可以通过 payload
参数进行区分。
设置好之后,在函数详情界面可以看到类似下面的图示。

如果一切顺利,定时任务就添加成功了,稍后可以在日志页面看到执行记录。

更新函数
如果你的函数使用的是 ACR 中的 Docker 镜像,当推送了新的镜像时,函数计算的版本不会自动更新,需要你登录网站后台手动修改,或者调用函数计算的 API 进行设置。
每次手动修改是一件很麻烦的事,建议使用 API,以便和现有的发布流程结合起来。你可以先安装 aliyun-cli 命令行工具,然后执行类似下面的命令:
aliyun fc PUT /2023-03-30/functions/YOUR_FC --region cn-shanghai --header "Content-Type=application/json;" --body "{\"tracingConfig\":{},\"customContainerConfig\":{\"image\":\"registry-vpc.cn-shanghai.aliyuncs.com/XXX/YYY:1.2.3\"}}"
请注意将其中的参数值替换为你的项目中的值。
小结
有一些定时任务(比如清理老数据、备份用户数据等)比较耗费资源,将它们迁移到函数计算中可以减少主服务器的负担,是一个不错的实践。
函数计算是按量收费的,多数情况下,定时任务使用函数计算应该比专门买一台服务器划算,不过也不要大意,请做好优化,同时注意关注每日的用量。
评论: