阿里云函数计算 FC 实战:部署 Python 爬虫服务并解决定时触发(Cron)延迟问题
·
一、环境准备
-
开通服务
- 登录阿里云控制台,开通「函数计算 FC」和「日志服务 SLS」(用于查看函数日志)。
- 安装阿里云 CLI 或使用控制台操作,推荐本地安装
funcraft工具(FC 部署工具):bash
npm install @alicloud/fun -g
-
本地项目结构创建如下目录结构,用于存放爬虫代码和配置:
plaintext
spider-service/ ├── index.py # 爬虫主逻辑 ├── requirements.txt # 依赖库 └── template.yml # FC 配置文件
二、编写 Python 爬虫代码
以爬取示例网页数据为例,index.py 代码如下:
python
运行
import requests
import logging
# 配置日志(对接 SLS)
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def handler(event, context):
"""FC 入口函数"""
try:
# 爬虫逻辑
url = "https://example.com"
response = requests.get(url, timeout=10)
logger.info(f"爬取成功,状态码:{response.status_code}")
return {"status": "success", "data": response.text[:100]} # 返回部分数据
except Exception as e:
logger.error(f"爬取失败:{str(e)}")
return {"status": "error", "message": str(e)}
requirements.txt 声明依赖:
plaintext
requests==2.31.0
三、配置函数计算(template.yml)
通过 template.yml 定义 FC 函数、触发器和资源配置:
yaml
ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
spider-service: # 服务名
Type: 'Aliyun::Serverless::Service'
Properties:
Description: 'Python 爬虫服务'
LogConfig: # 日志配置(需先创建 SLS 项目)
Project: 'fc-spider-log' # SLS 项目名
Logstore: 'spider-logstore' # SLS 日志库名
spider-function: # 函数名
Type: 'Aliyun::Serverless::Function'
Properties:
Handler: index.handler # 入口:文件名.函数名
Runtime: python3.9 # 运行时环境
CodeUri: ./ # 代码目录
MemorySize: 256 # 内存配置(根据爬虫需求调整)
Timeout: 60 # 超时时间(单位:秒,爬虫耗时不宜过长)
Events:
cron-trigger: # 定时触发器
Type: Timer
Properties:
Payload: '{"trigger": "cron"}' # 触发携带的参数
CronExpression: '0 0 * * * *' # Cron 表达式(UTC 时间,每天 0 点触发)
Enable: true # 启用触发器
四、部署函数到阿里云 FC
-
初始化配置执行
fun config输入阿里云 AccessKey(需具备 FC 操作权限)。 -
部署函数在项目根目录执行:
bash
fun deploy -y部署成功后,可在阿里云 FC 控制台查看函数和触发器。
五、解决定时触发(Cron)延迟问题
FC 定时触发器基于 Cron 表达式执行,但可能因资源调度等原因出现延迟。以下是优化方案:
1. 调整 Cron 表达式时区
FC 定时触发器默认使用 UTC 时间,若需按北京时间触发,需转换时区(北京时间 = UTC + 8)。例如:北京时间每天 8 点触发,对应 UTC 时间为 0 点,Cron 表达式为 0 0 * * * *。
2. 优化函数资源配置
- 内存与超时时间:若爬虫处理数据量大,适当提高
MemorySize(如 512MB)和Timeout,避免因资源不足导致触发延迟。 - 预留实例:对于高频或严格定时需求,配置「预留实例」(在函数配置中开启),避免冷启动耗时。
3. 触发时间精度优化
- FC 定时触发器的精度为 ±1 分钟,若需更高精度(如秒级),可在函数内添加「二次校准」逻辑:
python
运行
import time def handler(event, context): target_time = "08:00:00" # 目标触发时间(北京时间) current_time = time.strftime("%H:%M:%S", time.localtime()) if current_time > target_time: delay = (int(current_time.split(':')[0])*3600 + int(current_time.split(':')[1])*60 + int(current_time.split(':')[2])) - \ (int(target_time.split(':')[0])*3600 + int(target_time.split(':')[1])*60 + int(target_time.split(':')[2])) logger.warning(f"触发延迟 {delay} 秒,跳过本次执行") return {"status": "delayed", "delay_seconds": delay} # 正常爬虫逻辑...
4. 监控与告警
- 通过「云监控」配置触发器执行状态告警(如触发失败、延迟超过 5 分钟),及时发现问题。
- 查看 SLS 日志中的
triggerTime和startTime,计算实际延迟时间:sql
* | select triggerName, triggerTime, startTime, date_diff('second', triggerTime, startTime) as delay_seconds from log order by delay_seconds desc limit 10
六、验证与调试
- 手动触发:在 FC 控制台点击「测试函数」,输入空事件
{}验证爬虫逻辑。 - 查看日志:通过 SLS 控制台搜索函数日志,确认触发时间和执行结果。
- 定时触发检查:等待 Cron 表达式触发时间,查看函数执行记录(FC 控制台「调用日志」)
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)