【问题标题】:How do I reduce cold start time using google cloud function instances?如何使用谷歌云功能实例减少冷启动时间?
【发布时间】:2020-08-26 09:43:10
【问题描述】:

使用 firebase,您可以write cloud functions in multiple files
我有两个函数,名为“function1”和“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 来导出这些文件,如 here 所示。

文件:index.js

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

当我执行 function1 时,我可以从 function2 访问“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
    // ...
});

现在“admin”变量仅在我调用 function2 而不是 function1 时才被初始化。
Cloud Functions 经常recycles 之前调用的执行环境。
如果您在全局范围内声明一个变量,则其值可以在后续调用中重复使用,而无需重新计算。
但是现在“admin”变量将不会在后续调用中被重用,因为它没有在全局范围内声明。
所以我的问题是如何将“admin”变量存储在全局范围内(以便它可以被多个实例重用),但在调用 function1 时没有初始化它?

【问题讨论】:

    标签: javascript firebase google-cloud-platform google-cloud-functions


    【解决方案1】:

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

    文件: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 来导出这些文件,如 here 所示。

    文件: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;
    

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

    【讨论】:

      【解决方案2】:

      您尝试做的事情是不可能的。根据定义,两个服务器实例不能共享内存。它们彼此完全隔离。每个函数调用都在自己的实例中独立运行,两个不同的函数永远不能重用同一个实例。您将不得不接受 function1 的全局内存空间永远不会被 function2 看到。

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

      【讨论】:

        猜你喜欢
        • 2019-07-15
        • 1970-01-01
        • 1970-01-01
        • 2023-01-25
        • 2019-05-15
        • 2020-12-23
        • 1970-01-01
        • 2017-09-07
        • 1970-01-01
        相关资源
        最近更新 更多