首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >易火基云功能组织

易火基云功能组织
EN

Stack Overflow用户
提问于 2020-08-24 02:23:41
回答 1查看 1.4K关注 0票数 3

问题

在研究了Firebase文档、视频、StackOverflow、大量文章之后,以“轻松”的方式组织多个(大量)云功能并不明显。特别是,由于官方的Firebase文档没有提供明确的远景/建议。实际上,真正的问题是缺乏清晰的文档,说明如何从一开始就设置具有大量功能的Firebase项目。

我正试图找到一种简单的方法,考虑以下几点:

基于Firebase文档的deployments

  • Using

  • (每个新的Firebase用户都在阅读)

那样过多地进行异步/等待导入,这取决于命名约定,比如这个很好的示例https://codeburst.io/organizing-your-firebase-cloud-functions-67dc17b3b0da

从#函数(从初始设置(使用Firebase文档的初学者)到高级功能,如何迁移structure?

  • Minimize工作以添加/部署越来越多的云functions

),

  • 可伸缩性

  • Performance:延迟加载/初始化admin +确保只初始化一次
    • 最小化服务器实例冷启动time

  • 易于解释,易于使用,易于维护(肯定有点主观)

解决办法?

从手动部署的云函数到使用JavaScript进行简单的初始CLI设置,我尝试了以下文件结构,并取得了一些成功:

代码语言:javascript
复制
[project]/
- functions/
  - index.js
  - src/
    - functionA.js
    - functionB.js
    - ...
...

index.js

基于官方文档的结构:https://firebase.google.com/docs/functions/organize-functions

代码语言:javascript
复制
const functions = require('firebase-functions');

const functionA = require('./src/FunctionA');
exports.FunctionA = functionA.FunctionA;

const functionB = require('./src/FunctionB');
exports.FunctionB = functionA.FunctionB;

FunctionA.js

使用https://gist.github.com/saintplay/3f965e0aea933a1129cc2c9a823e74d7#file-index-js

代码语言:javascript
复制
const functions = require('firebase-functions');
const admin = require('firebase-admin');

// Prevent firebase from initializing twice
try { admin.initializeApp() } catch (e) {console.log(e);}

exports.FunctionA = ...

FunctionB.js

代码语言:javascript
复制
const functions = require('firebase-functions');
const admin = require('firebase-admin');

// Prevent firebase from initializing twice
try { admin.initializeApp() } catch (e) {console.log(e);}

exports.FunctionB = ...

问题(S)

implementation?

  • What

  • 是一个切实可行的解决方案吗?与异步/等待导入相比,

  • 是否存在性能问题?

  • admin.initializeApp()周围的-catch块--干净的将是类型记录等效的solution?
    • Cold-start时间:当通过Firebase CLI部署时,我在Google控制台“云函数”一节中注意到,在云控制台中手动创建函数时,所有云功能实例都包含所有其他函数的源代码
      • ,每个函数都只有自己的代码块为deployed/initialized/executed

  • 对优化有什么建议吗?(例如index.js的可维护性)
EN

回答 1

Stack Overflow用户

发布于 2020-08-25 11:17:03

我会试着一起回答你们的问题:

组织您的功能,文件和文件夹是一个意见问题。您始终可以使用index.js ()方法向您的要求其他函数。您不需要跟踪有关这方面的正式文档。从another stackoverflow question查看这个很好的解决方案

您需要注意的是,不要在全局范围中包含其他函数不使用的require语句。就像您有一个使用Nodejs库的函数,而另一个函数不使用这个库,并且在全局范围内需要这个库,那么获取库的冷启动将影响这两个函数:

代码语言:javascript
复制
const functions = require('firebase-functions');
const admin = require('firebase-admin');

// need the admin sdk
exports.functionA = ...

// doesn't need the admin sdk
exports.functionB = ...

在上面的示例中,获得admin的冷启动将应用于这两个函数。您可以通过以下方式对其进行优化:

代码语言:javascript
复制
const functions = require('firebase-functions');


// need the admin sdk
exports.functionA = functions.https.onRequest((request, response) => {

const admin = require('firebase-admin');
 ...
})


// doesn't need the admin sdk
exports.functionB = ...

我们只需要admin的功能,需要它来减少冷启动和优化记忆使用。

您甚至可以通过在类型记录中使用动态导入来更好地改善这一点,这将在调用时获取库或模块代码,而不是使用JS中的require静态导入。

代码语言:javascript
复制
import * as functions from 'firebase-functions'

// this variable will help to initialize the admin sdk once
let is_admin_initialized = false

export const functionA =
functions.https.onRequest(async (request, response) => {
    // dynamically import the Admin SDK here
    const admin = await import('firebase-admin')

    // Only initialize the admin SDK once per server instance
    if (!is_admin_initialized) {
        admin.initializeApp()
        is_admin_initialized = true
    }

  ...

})

关于:

try { admin.initializeApp() } catch (e) {console.log(e);}

我相信这是一个有效的实现,这将检查错误:

默认的Firebase应用程序

已经存在。这意味着您不止一次调用initializeApp(),而不提供应用程序名作为第二个参数。在大多数情况下,只需要调用initializeApp()一次。但是,如果您确实希望初始化多个应用程序,请将第二个参数传递给initializeApp(),以给每个应用程序一个唯一的名称。

除非您想要处理此错误,否则我建议使用上面的实现,并使用布尔标志:is_admin_initialized = false

关于冷启动,在无服务器架构中它是不可避免的坏处,目前还没有办法消除它,但是您可以通过遵循不同的实践来减少:

1-对于依赖于1或2个依赖项的JS函数,您应该期望大约有8s左右的冷启动,但这都取决于这些包的大小。

2.冷启动可在不同情况下发生,例如:

您的函数还没有被触发,比方说,在您的函数deployment

  • your函数实例被关闭之后,并且没有空闲的实例来接收即将到来的请求云函数,在我的经验中,可以使实例空闲几分钟左右。

3-不包括函数不需要的库(依赖项),而只使用JS中的静态导入with ()或TS中的动态异步导入来限定函数需要它们的依赖范围。记住,有时您不需要使用整个库,而只需要使用它的一个函数。在这种情况下,尝试只从库中导入该函数,而不是全部导入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63553965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档