serverless cos案例-下载资源后打包压缩 -异步

238 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

需求

本次需求需要从cos拉文件 在 服务器端压缩好后上传到另一个cos中 的异步操作,因为同步函数有限制函数的运行时间,当大任务的长时间运行的时候,在任务还没有结束,函数的运行时间超时的时候,会被强制挂起

思路

需要两个云函数,一个做访问请求,鉴权,控制入口。另一个做真正的工作,下载压缩,通知状态

如下 image.png

如何创建B异步函数

和同步函数一致,唯一不同的是创建函数的时候,选中异步选项

image.png

为什么要使用异步函数

因为异步函数最大运行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 image.png

真实环境也返回为 null

image.png

官方文档表示 确实有可能取不到,但是不说为什么,也不说如何解决

image.png

解决思路 队列执行 串行保证每次只执行一个任务

遗留问题

  • 1,无鉴权
  • 2,无校验,直接调用,容易被挤兑死b函数
  • 3,资源 运行内存需要申请,还没有申请下来