按照云开发扩展应用 redis 中的介绍,云函数代码如下,redis 连接在 main 函数之外,在 main 函数返回之后,没有断开 redis 连接,redis 连接会跟云函数实例一起留存,直到云函数实例被销毁。
const Redis = require('ioredis');
const redis = new Redis({
port: process.env.REDIS_PORT,
host: process.env.REDIS_HOST,
password: process.env.REDIS_PASSWORD,
});
exports.main = async () => {
let res = await new Promise((resolve) => {
redis.get('test', function (err, reply) {
if (err) {
resolve({ err });
}
resolve({ data: reply });
});
});
return { res };
};
结合云函数的运行机制,官方建议把同一个 redis 实例读写操作集合到一个云函数,这样在云函数实例被复用时,也可以复用 redis 连接,减少连接数。
但是,在调用云函数时,发现云函数运行在 Node.js 8.9 和 Node.js 10.15 上表现不同,在 Node.js 10.15 环境下,main 函数返回结果之后,云函数会继续等待异步任务执行完毕,但 redis 连接一直没有断开,所以会一直等待直到超时,报错如下:
{"errorCode":-1,"errorMessage":"Async invoking task timed out after 10 seconds","statusCode":433}
https://cloud.tencent.com/document/product/876/41764
云函数文档上介绍了 Node.js 8 和 Node.js 10 的不同,那么 Node.js 10 环境下,必须在 main 函数返回结果前断开 redis 连接吗?
Node.js 8.9 环境下,云函数实例被销毁后,redis 连接会自动断开吗?
综合考虑复用 redis 连接和节省云函数资源,是否更建议使用 Node.js 8.9 环境连接 redis?
不主动断开 会持续计费