在测试环境中,只有两个用户达到了100个活动连接限制

时间:2018-08-03 01:39:01

标签: firebase firebase-realtime-database aws-lambda

我有一个Web客户端和一些使用Admin SDK的Lambda函数。我最近注意到,我已经达到了100个并发连接限制,但我确实不应该接近该限制。而且,即使功能完成后,我的Lamba函数建立的连接似乎也不会断开。

任何想法:

  • 我如何防止这种连接增加?
  • 如何释放由过去的Lambda脚本建立的连接?
  • 如何监视哪些进程/线程/堆栈在保持连接?
  

注意:这是我正在尝试的测试环境,因此,我希望将其保留在免费层中,并且我的要求绝对不应该超过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

2 个答案:

答案 0 :(得分:1)

事实是您有到数据库的意外传入连接,这使得陈旧的实例似乎保持打开的连接。

最好的考虑是在函数显式断开连接之前先调用goOffline()。这也可能意味着您必须在函数开始时调用goOnline,因为它可能正在先前脱机的实例上运行。 goOnlinegoOffline都是同步调用afaik,但是从联机到应用程序中的数据可用之间肯定要有一段时间。

如果Lambda可以让您检测其实例的生命周期事件,那么它将是调用goOfflinegoOnline的首选位置。

答案 1 :(得分:0)

admin.initializeApp应该仅在脚本/节点应用中被调用一次。

Firebase SDK将HTTP2与Firebase云系统进行通信,因此我不确定为什么您会遇到最大连接问题,因为每次调用都不会占用唯一的套接字。

要注意的一件事是,免费层不支持对第三部分API的调用(例如sendgrid)。