首页 > 解决方案 > Google Cloud Functions 如何检测活动实例的数量?

问题描述

我想用 EXACT 1 INSTANCE ALWAYS 创建一个云函数...

我不介意某些用户是否收到 http 429、500 或任何疯狂的错误代码。但我确实希望始终在线拥有最大一项功能。

谷歌表示,案例函数试图在最大实例上进行升级,它将向用户抛出 http 429 ......但这是错误的。

我已经做了很多测试,当它达到某个请求峰值时,它总是会升级......所以由于谷歌无法管理他们自己创建的参数,我想自己做。

有什么方法可以获取特定云功能的活动实例的数量?这样我可以检查实例是否高于 1 并自己删除所有请求

=================更新==================

有人问我为什么我只想确保单个实例......通常我不会评论架构决策,但我会尝试解释这个。

我不喜欢 Firebase 实时数据库处理事务的方式,效率低下并且可能导致不必要的流量。我在这里有其他关于这个主题 的问题Android Firebase 事务有一个简单的计数器问题,由于这个问题,我认为使用 Cloud Functions 作为状态感知后端更容易(尽管我知道它显然不是设计的)

因此,我创建了一个函数,在热身期间将具有少量节点(每个节点是一个计数器)的 firebase 分支加载到一个字段中......
每次客户端需要触摸其中一个计数器时,它都会调用我的函数,并且因为它是加载到内存和单线程中,该函数将自动执行并返回http 200(尽可能简单和快速)......
我的客户端被构建为接收 ahttp 429在这种情况下它将等待随机时间并重试(直到成功)

该功能会不时与数据库同步,以确保一切正常。并且由于该函数现在是唯一触及数据库该分支的实体,因此可以保证它是廉洁的

几天前我已经部署了这个功能,根据仪表板,它需要 100 毫秒才能回复,峰值为 600 毫秒。所以这对我的标准来说绝对没问题,BUUUUUUT google 会自动将其缩放到 5 个实例的峰值……这破坏了计数器的完整性。

标签: firebasegoogle-cloud-functions

解决方案


不可能确保只有一个实例。Cloud Functions 的设计初衷并非如此。该文档指出:

处理流量高峰

在某些情况下,例如快速的流量激增,Cloud Functions 可能会在短时间内创建比指定的最大实例数限制更多的实例。如果您的函数不能容忍这种临时行为,您可能需要考虑安全边际并设置比您的函数可以容忍的更低的最大实例值。

从您的问题中不清楚为什么要限制为仅一个实例,但 Cloud Functions 显然不能保证这一点。听起来您需要其他一些解决方案来解决您的问题。由于您没有具体说明为什么只需要一个实例,因此没有太多可以说的替代方案。也许您可以使用Cloud Tasks通过将所有请求路由到传递到队列的 pubsub 主题并将其配置maxConcurrentDispatches1 来限制函数的执行速率,以便它一次只处理一条消息。


推荐阅读