logo科技微讯

阿里云函数计算使用笔记

作者:科技微讯
日期:2022-03-23
📝 笔记

创建日志服务时,不要让函数自动创建日志服务,而是应该在日志服务后台手动创建一个自定义的日志 project,并手动创建 logStore(日志库),然后回到函数计算后台把函数和这个 project 绑定,告诉函数把日志放在这个 project 的这个 logStore 中,注意创建 Logstore 时,日志服务默认为您配置 2 个 Shard,而免费额度时 31 个*天/月。

设置了 HTTP 触发器的函数,就是 HTTP 函数,其他函数都是事件函数。

腾讯云函数不支持 initializer 函数,但是阿里云函数支持。initializer 函数是相对于入口函数而言的,Initializer 函数在函数计算平台分配实例后执行,早于入口函数的执行。

具体来说,一个函数实例在首次执行时,如果它绑定了 Initializer 函数,则会首先执行这个 Initializer 函数,执行完成后,再执行这个函数的入口函数。当这个函数实例还没有被冻结,下次被复用时,则不会再次调用这个 Initializer 函数,而是直接执行入口函数。

Initializer 函数可以用来建立数据库连接,这样函数实例下次复用时,就不用重新建立数据库连接。http 函数和事件函数的 Initializer 写法一样,所以都有 callback 入参。

除了有 Initializer,还有 preFreeze、preStop 这两个生命周期,可以在 preStop 阶段关闭数据库连接,确保数据库连接数量不要过多,还可以做其他操作。

函数的 event 入参是以字节流的方式进入的,阿里云函数不会对它做任何处理。

rquest body 和 response body 都不能超过 6MB。

npm package 的使用方法有两种:

  • 层:把 node_modules 文件夹放在一个叫做 nodejs 的文件夹中,然后把 nodejs 文件夹打包为 zip 上传到后台,然后在 yaml 文件中更新层的 arn,最后 deploy 出去;
  • s build:在 code 文件夹中安装 npm package,如果配置了 yaml 文件,直接 s build;
  • zip 打包:在 code 文件夹中安装 npm package,然后把整个 code 文件夹里面的内容打包为 zip,注意不是把 code 文件夹打包,而是把 code 文件夹里面的内容打包,即解压缩之后入口函数所在的文件需要位于包内的根目录,最后把 zip 文件上传到后台;

您的阿里云账号(主账号)在单个地域内默认的按量实例上限数为 300。阿里云函数可以设置单实例并发数,即一个函数实例可以并发多少个,默认是 1,可以修改为最高 100,比如一个函数完成一个任务总耗时为 5s,其中有 4s 是等待 http 响应,那这 4s 其实是可以充分利用起来的,用它去执行另一个任务即可,这就叫做单实例并发。一个地域实例上限是 300,单实例的并发最高 100,那就是 30000 的并发。

开启单实例多并发需要设置大一点的超时时间,因为可能会不断涌入新的请求,你不知道这个函数什么时候可以歇一会,如果超时时间太短,可能会导致刚接收的请求就迫近函数超时的边缘。此外,多个请求在一个实例并发处理时,由于一个请求处理不当导致进程退出或者崩溃,会导致正在并发处理的其他请求也收到错误信息,这要求在编写函数时,尽量捕获请求级别的异常,不影响其他请求。更多注意事项,请看文档

日志可以用 console.log 打印,也可以用 context.logger.info(),开启单实例多并发后,用后者才能区分请求级别的日志。文档

阿里云 fc 的 nodejs SDKnpm 包地址。函数计算需要同时安装 @alicloud/openapi-client、@alicloud/fc-open20210406。

nodejs sdk 的使用示例:

//参考:https://help.aliyun.com/document_detail/311644.html
//注意要 require 两次 @alicloud/fc-open20210406,一个是 default,另一个没有 default
//具体每一个 fc api 怎么用,去 open API 试试:https://next.api.aliyun.com/api/FC-Open/2021-04-06

const Fc20140526 = require("@alicloud/fc-open20210406").default;
const $Fc20140526 = require("@alicloud/fc-open20210406");
const { Config } = require("@alicloud/openapi-client");

async function app() {
  let config = new Config({
    accessKeyId: "xxx",
    accessKeySecret: "xxxx",
    endpoint: "xxx.cn-hangzhou.fc.aliyuncs.com",
  });
  const client = new Fc20140526(config);
  // const listAliasesHeaders = new Fc20140526.ListAliasesHeaders({});
  const listAliasesRequest = new $Fc20140526.ListAliasesRequest({});
  const result = await client.listAliases("release", listAliasesRequest);
  console.log(result);
}
app();
donation赞赏
thumbsup0
thumbsdown0
暂无评论