【问题标题】:Can global scoped variables be modified by other Cloud Function invocations?其他 Cloud Function 调用是否可以修改全局范围的变量?
【发布时间】:2019-12-03 09:57:20
【问题描述】:

我正在使用 Cloud Functions,并且对全局范围变量的“状态”有疑问。

我知道云函数应该是无状态的,并且为每个实例初始化全局范围的变量(不是调用)。

假设在调用期间全局变量不会被其他调用保持不变是否安全?考虑以下 sn-p:

    var color = "blue" //global color variable

    async function logColor (req, res) => {
        var myColor = req.query.color
        color = myColor

        const checkColor = () => console.log(myColor === color)

        await new Promise((resolve, reject) => {
            var interval = setInterval(checkColor, 1000)

            setTimeout(() => {
                clearInterval(interval)
                resolve()
            }, 30000)
        })

        res.send()
    }

正如您在调用函数时看到的那样,它读取一个颜色查询参数并将全局“颜色”变量设置为该参数,然后检查全局变量是否与本地变量相同 30 秒。

我在几个不同的选项卡中使用不同的颜色调用它,并且输出始终为“真”,所以我假设在函数调用中设置全局变量是安全的,并希望在调用期间保持它们没有来自其他调用的“并发”,只要我们不使用它们来保持调用之间的状态。

另一个假设 globalObj 在异步操作期间保持不变的示例

    var globalObj

    async function myFunc(req, res) {
        globalObj.id = uuid()
        globalObj.name = req.query.name

        res.send(await asyncOperation(globalObj))
    }

这是正确的还是我遗漏了什么?

【问题讨论】:

    标签: javascript node.js google-cloud-functions


    【解决方案1】:

    marian.vladoi 的另一个答案并不完全正确。

    全局变量将被保留并在在同一服务器实例上多次调用同一函数之间重复使用。但是,函数可以在多个服务器实例上运行,因此这些全局变量不会在服务器实例之间共享。

    使用全局变量作为缓存或保留数据以供将来调用的一种方式是完全有效的,但您不希望使用它们来存储应用程序状态,因为无法保证它们将保留其值多长时间。

    您可能希望观看此系列视频,讨论 Cloud Functions 的工作原理。

    https://www.youtube.com/watch?v=2mjfI0FYP7Y&list=PLl-K7zZEsYLm9A9rcHb1IkyQUu6QwbjdM&index=2&t=0s

    【讨论】:

    • 但这意味着在一个函数的单次执行期间,我可以预期任何全局变量都被“锁定”并且不会被除该函数之外的任何东西更改,对吗?
    • 只有在函数结束后,如果我理解正确的话,我不能依赖于找到我的数据,因为我在调用另一个函数时将它留在了全局变量中。在单次执行期间,如果不是因为当前函数执行,它们不会改变
    • 如果您在函数的范围内声明一个全局变量,那么只有为该函数运行的代码才能更改该值。它不会意外改变。
    【解决方案2】:

    根据官方文档,每个云功能都在其自己的隔离执行上下文中运行。

    关于自动伸缩和并发:

    函数的每个实例只处理一个并发请求 时间。这意味着当您的代码正在处理一个请求时, 不可能将第二个请求路由到同一个请求 实例。因此原始请求可以使用全部 您请求的资源(CPU 和内存)。

    您不应依赖 Cloud Functions 共享变量或本地内存。

    您可以找到更多信息Cloud Functions Execution Environment

    【讨论】:

    • 这个答案并不完全正确。请在此处查看我的答案以获取更准确的详细信息。
    • 为了改进它,将“Cloud Functions 不共享变量或本地内存”更改为“您不应依赖 Cloud Functions 共享变量或本地内存”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多