【问题标题】:Cloud Functions - How to instantiate global functions/variables only once?Cloud Functions - 如何仅实例化全局函数/变量一次?
【发布时间】:2019-03-09 17:23:51
【问题描述】:

我有一个使用 Cloud Functions 与 Google Cloud SQL 实例通信的 firebase 应用程序。这些云函数用于执行 CRUD 操作。我想确保数据库反映 CRUD 操作,因此,每次推送新功能代码时都运行迁移代码,以确保数据库始终是最新的。

我在一个全局函数中这样做

const functions = require('firebase-functions')
const pg = require('pg')    

// Create if not exists database
(function() {
    console.log('create db...')
})()

exports.helloWorld = functions.https.onRequest((request, response) => {
    console.log('Hello from Firebase function log!')
    response.send('Hello from Firebase!')
})

exports.helloWorld2 = functions.https.onRequest((request, response) => {
    console.log('Hello from Firebase function log 2!')
    response.send('Hello from Firebase 2!')
})

当我部署时,此控制台日志会运行两次。

现在我了解到,正如他们的文档中所述,无法知道 Cloud Functions 将为这些函数启动多少个实例:

预计包含函数定义的函数文件中的全局范围在每次冷启动时执行,但如果实例已经初始化则不会执行。`

如果我添加第三个函数,此控制台日志现在在日志中显示 3 次,而不是 2 次,每个函数显示一次。 说每个上传的函数都有一个新实例是否正确?我想了解当我上传一组云函数时会发生什么。

如果是这样 - 是否没有可靠的方法在云函数中的全局函数内运行迁移代码?

【问题讨论】:

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


    【解决方案1】:

    您所做的不是 Cloud Functions 支持的用例。 Cloud Functions 代码运行以响应项目中发生的事件。部署时不会发生“一次性”函数调用。如果您需要运行一次代码,只需从您的桌面或您控制的其他服务器上运行即可。

    您还应该努力尽量减少在您的函数的全局范围内发生的工作量。全局变量将被实例化并为在您的应用程序中运行一个函数的每个分配的服务器实例运行一次,因为每个函数彼此完全隔离运行,并且每个函数都有自己的所有内容的副本。观看我关于 function scaling and isolation 的视频,以更好地了解这种行为。

    【讨论】:

    • 谢谢道格,这完美地回答了我的问题。我知道我的方法肯定是一种 hacky 方式,尽管它现在解释了我得到的行为。看起来我的粗体问题的答案是“是”。顺便说一句,很棒的视频,会检查更多。
    • 全局变量不会为您应用中的每个函数实例化一次。请参阅以获取更多信息。 medium.com/@DazWilkin/cloud-functions-global-scope-7450a5f08038
    猜你喜欢
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 2013-11-12
    • 2013-06-12
    • 1970-01-01
    • 2019-04-02
    相关资源
    最近更新 更多