小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
需求
本次需求需要从cos拉文件 在 服务器端压缩好后上传到另一个cos中 的异步操作,因为同步函数有限制函数的运行时间,当大任务的长时间运行的时候,在任务还没有结束,函数的运行时间超时的时候,会被强制挂起
思路
需要两个云函数,一个做访问请求,鉴权,控制入口。另一个做真正的工作,下载压缩,通知状态
如下
如何创建B异步函数
和同步函数一致,唯一不同的是创建函数的时候,选中异步选项
为什么要使用异步函数
因为异步函数最大运行24小时。同步函数只能最大使用900秒
A 同步函数 代码
1,定义函数配置
const funConfig = {
FunctionName: 'ZipFile-ay-0903'
}
定义格式化api网关使用的返回值函数
const reJson = function(data,state = 200){
console.log('reJson-----------',data)
return {
"isBase64Encoded": false,
"statusCode": state,
"headers": {"Content-Type": "application/json"},
"body": JSON.stringify(data)
}
}
得到参数
const {
getParams
} = require('./common/utils'); //此函数在zip demo中
const {
secretId,
secretKey,
token,
bucket,
region,
key,
sourceList,
sourceConfigList,
flatten,
} = getParams(event, context);
引入 云函数sdk
const tencentcloud = require("tencentcloud-sdk-nodejs");
const ScfClient = tencentcloud.scf.v20180416.Client;
const clientConfig = {
credential: {
secretId: secretId,
secretKey: secretKey,
},
region: region,
profile: {
httpProfile: {
endpoint: "scf.tencentcloudapi.com",
},
},
};
const client = new ScfClient(clientConfig);
配置调用B异步函数运行所使用的参数
const params = {
"FunctionName": funConfig.FunctionName,
"InvocationType": "Event",
"ClientContext": JSON.stringify({
"secretId": secretId,
"secretKey": secretKey,
"bucket": bucket,
"region": region,
"key": key,
"sourceList": sourceList
})
}
调用B异步函数的详情
// 得到函数运行状态
const funDetailState = {}
try {
const data = await client.GetReservedConcurrencyConfig({
"FunctionName": funConfig.FunctionName
})
console.log('得到预知并发:--',data);
funDetailState = data;
} catch (error) {
// return reJson(error)
}
调用B异步函数,并返回状态
try {
const data = await client.Invoke(params)
data.funDetailState = funDetailState
console.log('data-type',typeof data)
return reJson(data)
} catch (error) {
return reJson(error)
}
代码 B异步函数代码
异步函数参数同步函数代码。
问题
无法得到当前函数的保留内存
console.cloud.tencent.com/api/explore…
永远返回为null
真实环境也返回为 null
官方文档表示 确实有可能取不到,但是不说为什么,也不说如何解决
解决思路 队列执行 串行保证每次只执行一个任务
遗留问题
- 1,无鉴权
- 2,无校验,直接调用,容易被挤兑死b函数
- 3,资源 运行内存需要申请,还没有申请下来