当前位置: 首页 > 知识库问答 >
问题:

创建多个轻量级Google Cloud Functions的最佳实践?

唐茂实
2023-03-14

谷歌云功能的运作方式似乎是:

  • 你的模块进入一个函数目录

这很奇怪,因为:

  • 即使模块<代码>一个。js和两个。js在运行时需要不同的包,即共享的包。它们之间的json意味着它们的启动时间将比单独启动慢,因为它们都需要安装包的所有依赖项,而不仅仅是它们自己的

因此,确保云功能以尽可能轻的运行时占用空间以最佳方式运行的最佳实践是什么?谷歌的设计决策似乎意味着,你做的云功能越多,那么每个云功能中捆绑的垃圾就越多,速度越慢,成本也越高。

另一方面,在我看来,这对谷歌来说是一个更好的方法:每个云函数都应该有自己的目录,在每个目录中都有一个package.json文件和一个index.js文件。然后index.js文件执行module.exports=函数(... args){}导出默认函数(... args){}

这样,架构就与人们期望云功能的操作方式保持一致——云功能代表单个功能——而不是云功能在您的所有云功能之间安装共享依赖关系,然后加载一个模块可以包含多个云功能,但只使用一个,然后从加载的模块中只执行一个功能。

有趣的是,Azure Functions似乎完全按照我期望的云函数运行方式设计:https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node

共有2个答案

花和宜
2023-03-14

我使用的是modofunm(https://modofun.js.org),它是一个基于请求路径进行多种操作的路由器。这允许我将相关功能收集到一个模块中,该模块部署为单个Google Cloud Function。该模块中所有功能的依赖关系都是相同的,因此具有依赖效率。您还可以共享公共全局资源,例如数据库连接。

我同意,单独部署每个功能都是浪费资源,而且很难维护。

我这样做是为了我在生产中的Google Cloud Functions部署。

晋奕
2023-03-14

我们可以通过要求一个文件导出特定目录及其子目录中的每个文件来一次导出所有云函数,而不是单独导出每个云函数。

'use strict';

const admin = require('firebase-admin');
const functions = require('firebase-functions');
const logging = require('@google-cloud/logging')();
const stripe = require('stripe')(functions.config().stripe.token);

admin.initializeApp(functions.config().firebase);

module.exports = require('./exports')({
    admin, functions, logging, stripe
});

我们可以为每个提供者创建一个文件夹,例如auth、数据库、https,我们可以在其中组织相关资源的事件,例如auth.user.on创建database.ref.on写入

通过在每个文件中使用事件以这种方式构造文件,我们可以搜索函数文件,并使用文件路径动态创建云函数的名称并将其导出。

e、 g.functions/exports/auth/user/onCreate。f、 js-

'use strict';

module.exports = (app) => {

    const glob = require('glob');

    glob.sync('./**/*.f.js', { cwd: __dirname }).forEach(file => {

        const only = process.env.FUNCTION_NAME;
        const name = concoctFunctionName(file);

        if (only === undefined || only === name) {
            exports[name] = require(file)(app);
        }
    });

    return exports;
}

function concoctFunctionName(file) {

    const camel = require('camelcase');
    const split = file.split('/');
    const event = split.pop().split('.')[0];
    const snake = `${event}_${split.join('_')}`;

    return camel(snake);
}

最后,我们的函数文件可以使用传递的参数来访问常用的服务,例如Firebase Admin和Functions,甚至Stripe。

'use strict';

module.exports = ({ admin, functions, stripe }) => {

    return functions.auth.user().onCreate(event => {

        const { email, uid } = event.data;
        const ref = admin.database.ref.child(`user-customer/${uid}`);

        return stripe.customers.create({ 
            email, metadata: { uid } 
        }).then(customer => {
            return ref.set(customer);
        });
    });
}

 类似资料:
  • 问题内容: 我的应用程序是带有密集字符串处理的多线程。我们正在经历过多的内存消耗,并且性能分析表明这是由于String数据引起的。我认为使用某种flyweight模式实现甚至是缓存将极大地受益于内存消耗(我可以肯定Strings通常是重复的,尽管我在这方面没有任何硬数据)。 我看过Java常量池和String.intern,但似乎可以引发一些PermGen问题。 在Java中实现应用程序范围的多线

  • 本文向大家介绍ThreadPoolExecutor 创建方法最佳实践?相关面试题,主要包含被问及ThreadPoolExecutor 创建方法最佳实践?时的应答技巧和注意事项,需要的朋友参考一下 在《阿里巴巴 Java 开发手册》“并发处理”这一章节,明确指出线程资源必须通过线程池提供,不允许在应用中自行显示创建线程。 为什么呢? 使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源开

  • 问题内容: 我想在Django中创建多个用户。我想知道哪种方法最好。 还是应该使用.. 还是我必须创建自定义用户模型…这将对创建多种类型的用户非常有用… ?? 问题答案: Django没有多个用户-它只有一个用户,然后根据权限,用户可以执行不同的操作。 因此,首先-django中只有一种用户类型。如果你使用默认的身份验证框架,则从将此用户的模型称为。 如果要自定义django中的用户行为,可以执行

  • 问题内容: 我一直在使用jQuery在基于Web的应用程序中完成整个AJAX魔术。但是,我来到了一个决定,我并不需要所有这些神奇功能jQuery有,除了它的AJAX功能(例如,,,和)。 您能推荐轻量级的跨浏览器AJAX库/框架(最大10 kb)吗? 问题答案: 您可以通过删除不需要的模块来缩小jQuery的大小,只需修改Makefile文件即可。

  • 问题内容: 我想知道 在go中处理多层抽象错误 的最佳方法是什么。每当我必须在程序中添加新的级别抽象时,都必须将错误代码从较低级别传输到较高级别。从而日志文件中有重复的通讯,或者我必须记住删除低级别的通讯形式并将其转移到更高级别。下面简单地举例。我跳过了创建每个对象的简短代码,但是我认为您理解我的问题 结果在日志文件中,我得到重复的帖子 反过来,如果我仅将某些部分转移到更高的级别而没有其他日志,那

  • 问题内容: 我想用Python(不是数组)中的一个创建10个变量。像这样: 我想创建的变量名,在这种情况下: ,,,…, 我不想一个数组 我有一个坐标图(640 x 480)。我正在确定像素颜色为白色的坐标。地面上有3个球,我想获取每个球的中心坐标,因此,如果要评估的坐标距离最后一个球很近,则x和y坐标将被平均(如果该坐标属于a)新球的坐标将属于新坐标组。 问题答案: 您不应该这样做,但是如果您真