华为云 FunctionGraph 定时触发器实战:把每天重复的事交给函数去做
【摘要】 FunctionGraph 定时触发器把每天重复的导出、清理、同步任务函数化:完整 Python 示例、Cron 时区坑、幂等与重试设计、成本和日志可观测性实践。
一、为什么要把"每天重复做一次"的事情函数化
日常开发里总有一批这样的任务:每天导出一次报表、每小时清理一次临时对象、每天同步一次数据、每天定时发一条通知。它们单次执行时间不长,但出现频率高、时间点固定,写成本地脚本就要额外维护一台机器,还要考虑进程存活、日志、失败重试。
Serverless 的思路正好契合这类场景:把逻辑写成一个函数,由平台按时触发,执行完即释放资源,没有任务时不计费。华为云 FunctionGraph(函数工作流)提供了定时触发器,配合 OBS、RDS、SMN 等服务,可以覆盖大部分"小、频、定时"的自动化需求。
二、整体方案
一个典型的最小方案只需要三部分:
- 函数:Python 3.9 运行时,负责真正的业务逻辑;
- 定时触发器:Cron 表达式,例如
0 30 8 * * ?表示每天 08:30 触发; - 下游服务:OBS 存文件、RDS 存数据、SMN 发通知。
函数不需要公网入口,也不需要常驻进程,触发器到点调用即可。
三、函数代码示例
下面是一个每天把 MySQL 中的统计结果导出成 CSV 并上传到 OBS 的函数骨架:
import csv
import io
import json
import os
import pymysql
import boto3
# OBS 兼容 S3 协议,直接用 boto3 访问
s3 = boto3.client(
's3',
endpoint_url='https://obs.cn-north-4.myhuaweicloud.com',
aws_access_key_id=os.environ['AK'],
aws_secret_access_key=os.environ['SK'],
)
def handler(event, context):
conn = pymysql.connect(
host=os.environ['DB_HOST'],
user=os.environ['DB_USER'],
password=os.environ['DB_PASS'],
database=os.environ['DB_NAME'],
charset='utf8mb4',
)
try:
with conn.cursor() as cur:
cur.execute('SELECT dt, pv, uv FROM daily_stat WHERE dt = CURDATE()')
rows = cur.fetchall()
finally:
conn.close()
buf = io.StringIO()
writer = csv.writer(buf)
writer.writerow(['dt', 'pv', 'uv'])
writer.writerows(rows)
key = 'report/%s.csv' % event.get('date', 'today')
s3.put_object(Bucket=os.environ['BUCKET'], Key=key, Body=buf.getvalue().encode('utf-8'))
return {'statusCode': 200, 'body': json.dumps({'key': key, 'rows': len(rows)})}
几点说明:
- 依赖(pymysql、boto3)需要打成 zip 一起上传,或者在函数配置里挂载依赖层;
- AK/SK 不要硬编码,放到函数的环境变量或 DEW 密钥管理里;
- 单次执行建议控制在 5 分钟以内,超过这个量级更适合用数据工坊或批处理服务。
四、定时触发器的几个坑
- 时区:Cron 表达式默认按 UTC 解析,写
0 30 8 * * ?想表达北京时间 08:30,往往要写成0 30 0 * * ?,配置完先手动触发一次确认时间点。 - 重试:异步调用失败会按配置重试,业务逻辑要保证幂等,比如按日期覆盖写同一个 key,而不是追加。
- 超时:函数默认超时时间较短,涉及数据库查询或大文件上传时记得调大,并把数据库连接放在函数内部建立、在 finally 中关闭。
- 并发:定时任务经常是整点触发,如果同一时刻有多个任务,注意数据库连接数和 OBS 的 QPS 限制。
五、成本与可观测性
FunctionGraph 按调用次数和执行时长计费,这类每天几十次、每次几秒的任务,一个月通常在一元以内。日志默认写入 LTS,可以直接在函数详情页查看调用链和错误堆栈;需要告警时,给函数配置 SMN 通知或 Cloud Eye 告警规则即可。
六、小结
"定时 + 短任务 + 无状态"是 Serverless 最舒服的落点。把这类任务从一台常年开着的跳板机上搬走,换来的不只是成本下降,还有更清晰的日志、更简单的发布流程和更少的运维负担。先用一个最简单的导出任务跑通链路,再把其他重复劳动逐个迁移过去,通常是性价比最高的做法。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)