华为云 FunctionGraph 定时触发器实战:把每天重复的事交给函数去做

举报
yd_284271146 发表于 2026/10/23 08:19:16 2026/10/23
【摘要】 FunctionGraph 定时触发器把每天重复的导出、清理、同步任务函数化:完整 Python 示例、Cron 时区坑、幂等与重试设计、成本和日志可观测性实践。

一、为什么要把"每天重复做一次"的事情函数化

日常开发里总有一批这样的任务:每天导出一次报表、每小时清理一次临时对象、每天同步一次数据、每天定时发一条通知。它们单次执行时间不长,但出现频率高、时间点固定,写成本地脚本就要额外维护一台机器,还要考虑进程存活、日志、失败重试。

Serverless 的思路正好契合这类场景:把逻辑写成一个函数,由平台按时触发,执行完即释放资源,没有任务时不计费。华为云 FunctionGraph(函数工作流)提供了定时触发器,配合 OBS、RDS、SMN 等服务,可以覆盖大部分"小、频、定时"的自动化需求。

二、整体方案

一个典型的最小方案只需要三部分:

  1. 函数:Python 3.9 运行时,负责真正的业务逻辑;
  2. 定时触发器:Cron 表达式,例如 0 30 8 * * ? 表示每天 08:30 触发;
  3. 下游服务: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 分钟以内,超过这个量级更适合用数据工坊或批处理服务。

四、定时触发器的几个坑

  1. 时区:Cron 表达式默认按 UTC 解析,写 0 30 8 * * ? 想表达北京时间 08:30,往往要写成 0 30 0 * * ?,配置完先手动触发一次确认时间点。
  2. 重试:异步调用失败会按配置重试,业务逻辑要保证幂等,比如按日期覆盖写同一个 key,而不是追加。
  3. 超时:函数默认超时时间较短,涉及数据库查询或大文件上传时记得调大,并把数据库连接放在函数内部建立、在 finally 中关闭。
  4. 并发:定时任务经常是整点触发,如果同一时刻有多个任务,注意数据库连接数和 OBS 的 QPS 限制。

五、成本与可观测性

FunctionGraph 按调用次数和执行时长计费,这类每天几十次、每次几秒的任务,一个月通常在一元以内。日志默认写入 LTS,可以直接在函数详情页查看调用链和错误堆栈;需要告警时,给函数配置 SMN 通知或 Cloud Eye 告警规则即可。

六、小结

"定时 + 短任务 + 无状态"是 Serverless 最舒服的落点。把这类任务从一台常年开着的跳板机上搬走,换来的不只是成本下降,还有更清晰的日志、更简单的发布流程和更少的运维负担。先用一个最简单的导出任务跑通链路,再把其他重复劳动逐个迁移过去,通常是性价比最高的做法。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。