创建日志服务时,不要让函数自动创建日志服务,而是应该在日志服务后台手动创建一个自定义的日志 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 的使用方法有两种:
您的阿里云账号(主账号)在单个地域内默认的按量实例上限数为 300。阿里云函数可以设置单实例并发数,即一个函数实例可以并发多少个,默认是 1,可以修改为最高 100,比如一个函数完成一个任务总耗时为 5s,其中有 4s 是等待 http 响应,那这 4s 其实是可以充分利用起来的,用它去执行另一个任务即可,这就叫做单实例并发。一个地域实例上限是 300,单实例的并发最高 100,那就是 30000 的并发。
开启单实例多并发需要设置大一点的超时时间,因为可能会不断涌入新的请求,你不知道这个函数什么时候可以歇一会,如果超时时间太短,可能会导致刚接收的请求就迫近函数超时的边缘。此外,多个请求在一个实例并发处理时,由于一个请求处理不当导致进程退出或者崩溃,会导致正在并发处理的其他请求也收到错误信息,这要求在编写函数时,尽量捕获请求级别的异常,不影响其他请求。更多注意事项,请看文档。
日志可以用 console.log
打印,也可以用 context.logger.info()
,开启单实例多并发后,用后者才能区分请求级别的日志。文档。
阿里云 fc 的 nodejs SDK,npm 包地址。函数计算需要同时安装 @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();