如何使用谷歌云功能实例减少冷启动时间



使用firebase,您可以在多个文件中编写云函数
我有两个函数,名为"function1"one_answers"function2",位于两个独立的文件中。

文件:function1.js

const functions = require('firebase-functions');//This will be executed regardless of the function called
exports.function1 = functions.https.onRequest((request, response) => {
// ...
});

文件:function2.js

const functions = require('firebase-functions');//This will be executed regardless of the function called
const admin = require('firebase-admin');//This will be executed regardless of the function called
exports.function2 = functions.https.onRequest((request, response) => {
// ...
});

现在我使用index.js导出这些文件,如下所示。

文件:index.js

const function1 = require('./function1');
const function2 = require('./function2');
exports.function1 = function1.function1;
exports.function2 = function2.function2;

当我执行函数1时,我可以从功能2访问"admin"变量
显而易见的解决方法是不在全局范围内声明变量。

修改文件:function2.js

const functions = require('firebase-functions');//This will be executed regardless of the function called
exports.function2 = functions.https.onRequest((request, response) => {
const admin = require('firebase-admin');//This will only be executed when function2 is called
// ...
});

现在,只有当我调用function2而不是function 1时,"admin"变量才会初始化
云函数经常回收以前调用的执行环境
如果在全局范围内声明变量,则其值可以在后续调用中重用,而无需重新计算
但现在"admin"变量将不会在后续调用中重复使用,因为它没有在全局范围中声明
所以我的问题是,如何将"admin"变量存储在全局作用域上(以便它可以在多个实例中重复使用(,但在调用函数1时不进行初始化?

您想要做的事情是不可能的。根据定义,两个服务器实例不能共享内存。他们彼此完全隔绝。每个函数调用都在自己的实例中独立运行,两个不同的函数永远不能重用同一个实例。您必须接受函数1的全局内存空间永远不会被函数2看到。

观看此视频了解更多信息:https://www.youtube.com/watch?v=rCpKxpIMg6o

经过一些研究,答案是对全局变量进行惰性初始化
如果在全局范围内初始化变量,初始化代码将始终通过冷启动调用执行,从而增加函数的延迟
如果某些对象未在所有代码路径中使用,请考虑按需延迟初始化它们:

文件:function1.js

exports.function1 = functions.https.onRequest((request, response) => {
// ...
});

文件:function2.js

exports.function2 = functions.https.onRequest((request, response) => {
admin = admin || require('firebase-admin');
// ...
});

现在我使用index.js导出这些文件,如下所示。

文件:index.js

const functions = require('firebase-functions');
const admin;
const function1 = require('./function1');
const function2 = require('./function2');
exports.function1 = function1.function1;
exports.function2 = function2.function2;

如果在单个文件或多个文件中定义多个函数,并且不同的函数使用不同的变量,则这一点尤为重要
除非使用惰性初始化,否则可能会将资源浪费在已初始化但从未使用过的变量上。

相关内容

  • 没有找到相关文章

最新更新