我有一个Web客户端和一些使用Admin SDK的Lambda函数。我最近注意到,我已经达到了100个并发连接限制,但我确实不应该接近该限制。而且,即使功能完成后,我的Lamba函数建立的连接似乎也不会断开。
任何想法:
注意:这是我正在尝试的测试环境,因此,我希望将其保留在免费层中,并且我的要求绝对不应该超过100有效限制。我正在按产品进行付费计划。
我尝试通过使用以下连接代码来避免多次调用initializeApp
。在此示例中,我仅将一个数据库作为后端,因此每次使用默认的 DEFAULT 名称。
const runningApps = new Set(firebase.apps.map(i => i.name));
this.app = runningApps.has(name)
? firebase.app()
: firebase.initializeApp({
credential: firebase.credential.cert(serviceAccount),
databaseURL: config.databaseUrl
});
我现在正试图显式关闭与goOffline
的连接,但是这又导致了另一个问题,即第二个连接-又是DEFAULT应用程序已经设置并且只是重复使用已经建立的连接,我得到以下日志:
# Generated as result of `goOnline`
Connecting to Firebase: [https://xyz.firebaseio.com]
appears to be already connected
# Listening on ".info/connected" comes back as true, resulting in:
AbstractedAdmin: connected to [DEFAULT]
# but then I get this error
NotAllowed: You must first connect before using the database() API at Object._getFirebaseType
答案 0 :(得分:1)
事实是您有到数据库的意外传入连接,这使得陈旧的实例似乎保持打开的连接。
最好的考虑是在函数显式断开连接之前先调用goOffline()
。这也可能意味着您必须在函数开始时调用goOnline
,因为它可能正在先前脱机的实例上运行。 goOnline
和goOffline
都是同步调用afaik,但是从联机到应用程序中的数据可用之间肯定要有一段时间。
如果Lambda可以让您检测其实例的生命周期事件,那么它将是调用goOffline
和goOnline
的首选位置。
答案 1 :(得分:0)
admin.initializeApp
应该仅在脚本/节点应用中被调用一次。
Firebase SDK将HTTP2与Firebase云系统进行通信,因此我不确定为什么您会遇到最大连接问题,因为每次调用都不会占用唯一的套接字。
要注意的一件事是,免费层不支持对第三部分API的调用(例如sendgrid)。