firebase 谷歌云功能如何检测活动示例的数量?

vcirk6k6  于 2022-12-24  发布在  其他
关注(0)|答案(3)|浏览(115)

我想创建一个云函数,总是使用EXACT 1 INSTANCE ...
我不介意一些用户得到http 429,500或任何疯狂的错误代码。但我确实希望总是最大一个功能在线。
Google说case函数试图在最大示例数上使用escaolanate,它将向用户抛出http 429 ...但这是错误的。
我已经做了大量的测试,总是得到升级时,它达到一些请求高峰...所以,由于谷歌ins不能管理自己创建的参数,我想自己做。
有没有什么方法可以让我得到一个特定的云函数的活动示例的数量?这样我就可以检查示例是否大于1,然后自己丢弃所有请求
================更新================
我被问到为什么我只想确保一个示例...通常我不评论架构的决定,但我会尝试解释这一个。
我不喜欢Firebase实时数据库处理事务的方式,效率低下,可能会导致不必要的流量。我在这里有关于这个主题Android Firebase transaction having a simple counter problem的其他问题,由于这个问题,我认为使用云函数作为状态感知后端要容易得多(尽管我知道它的设计显然不是这样的)
所以我创建了一个函数,在预热期间从firebase加载一个分支到一个字段,该分支具有几个节点(每个节点是一个计数器)...
每当客户端需要触摸其中一个计数器时,它就会调用我的函数,由于它是加载到内存中的,并且是单线程的,所以该函数会原子地执行它并返回http 200(尽可能简单和快速)...
我的客户机被构建为接收http 429的可能性,在这种情况下,它将等待随机的时间量并重试(直到成功)
函数会不时地与数据库同步,以保证一切正常。由于函数现在是唯一与数据库的此分支接触的实体,因此保证其不受损坏
我已经部署了这个功能前几天,根据 Jmeter 板它需要100毫秒回复与峰值600毫秒.所以它是绝对罚款为我的标准,BUUUUUUT谷歌是自动scalonating它的峰值5示例...什么打破了计数器的完整性.

jjhzyzn0

jjhzyzn01#

不可能确保只有一个示例。这不是云函数的设计工作方式。文档声明:

处理流量高峰

在某些情况下,如快速流量激增,云函数可能会在短时间内创建超过指定最大示例限制的示例。如果您的函数无法容忍这种临时行为,您可能需要考虑安全裕度,并设置低于函数所能容忍的最大示例值。
从你的问题“为什么"要限制只有一个示例看不清楚,但是云函数显然不能保证,听起来你的问题需要其他的解决方案,既然你没有具体说”为什么"只需要一个示例,没有什么可以替代的。也许您可以使用Cloud Tasks来限制函数的执行速度,方法是通过pubsub主题路由所有请求,然后将其传递给queue,并使用maxConcurrentDispatches为1,因此它一次只处理一条消息。

w51jfk4q

w51jfk4q2#

正如它很好地解释了谷歌功能并不是真的建立控制或限制示例(setMaxInstances参数只是一个“我们会尝试,没有保证”,什么仍然没有意义给我)。我创建了这个变通方案,将工作的任何人有类似的要求。

const igDatabase = require('firebase-admin').initializeApp({
//set your firebase config
}).database();

let singleton = false;

function makeid(length) {
   var result           = '';
   var characters       = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
   var charactersLength = characters.length;
   for ( var i = 0; i < length; i++ ) {
      result += characters.charAt(Math.floor(Math.random() * charactersLength));
   }
   return result;
}

igDatabase.ref('instances/myFunction').transaction(function(post) {
    if (post === null || post == false){
        singleton = makeid(7);      

        console.log("Finished start up instance: "+singleton);

        return singleton;
    }
    else
        return;

  });

exports.helloworld = (req, res) => {

    if(singleton)
        res.status(200).send("hello world!!");

    else
        res.status(429).send("not valid singleton");

};

我不是很喜欢这个解决方案,但它会做的工作。
此解决方案的问题:
1-如果重新部署函数时没有清除事务正在监视的节点,则将出现“零示例场景”
2 -必须构建客户端以了解此情况并重试案例http 429
3-理想情况下,在发送http 429后,示例应该做一些类似sleep(random)的事情,这将有助于客户端在重试后与另一个示例连接。但我真的不知道如何正确地做。建议?

nom7f22z

nom7f22z3#

一个解决方案可能包含一个辅助函数,它检查日志(指定区域、项目和初始函数名)以查看在上一个时间段内是否生成了任何内容,等待,再次检查,如果没有,则运行初始函数。辅助函数必须不断运行或根据需要运行。
或者使用环境变量作为计数器,这确实意味着你的函数必须是健壮的。每次调用变量时更新变量,并在函数运行结束时减去它。

相关问题