【问题标题】:Why is Realtime Database update sometimes delayed by the burst of token renewal?为什么实时数据库更新有时会因令牌更新的爆发而延迟?
【发布时间】:2021-04-22 04:06:13
【问题描述】:

在定期运行以从 App Engine 写入 Firebase 实时数据库的 Node.js 后台应用程序中,有时我会遇到可能需要将近一分钟的巨大延迟。执行写操作的代码很简单:

await ref.update(updates);

代码已按时完成,但不知何故该过程尚未完成。好奇,我添加了enableLogging(true) 以启用详细日志记录。我发现当延迟发生时,有很多行看起来像:

2021-01-18 01:25:17.512 WIT
[Realtime Database] p:0: {"r":1525,"a":"gauth","b":{"cred":"..."}}
Default
2021-01-18 01:25:17.515 WIT
[Realtime Database] p:0: Auth token refreshed
Default
2021-01-18 01:25:17.515 WIT
[Realtime Database] p:0: {"r":1526,"a":"gauth","b":{"cred":"..."}}
Default
2021-01-18 01:25:17.517 WIT
[Realtime Database] p:0: Auth token refreshed
Default
2021-01-18 01:25:17.517 WIT
[Realtime Database] p:0: {"r":1527,"a":"gauth","b":{"cred":"..."}}
Default
2021-01-18 01:25:17.521 WIT
[Realtime Database] p:0: Auth token refreshed
Default
2021-01-18 01:25:17.521 WIT
[Realtime Database] p:0: {"r":1528,"a":"gauth","b":{"cred":"..."}}
Default
2021-01-18 01:25:17.523 WIT
[Realtime Database] p:0: Auth token refreshed
Default
2021-01-18 01:25:17.523 WIT
[Realtime Database] p:0: {"r":1529,"a":"gauth","b":{"cred":"..."}}
Default
2021-01-18 01:25:17.524 WIT
[Realtime Database] p:0: Auth token refreshed
Default
2021-01-18 01:25:17.525 WIT
[Realtime Database] p:0: {"r":1530,"a":"gauth","b":{"cred":"..."}}
Default
2021-01-18 01:25:17.527 WIT
[Realtime Database] p:0: Auth token refreshed
Default
2021-01-18 01:25:17.527 WIT
[Realtime Database] p:0: {"r":1531,"a":"gauth","b":{"cred":"..."}}
Default
2021-01-18 01:25:17.530 WIT
[Realtime Database] p:0: Auth token refreshed
...
2021-01-18 01:25:38.705 WIT
[Realtime Database] p:0: from server: {"r":1525,"b":{"s":"ok","d":{"auth":null,"expires":1610911538}}}
Default
2021-01-18 01:25:38.812 WIT
[Realtime Database] p:0: from server: {"r":1526,"b":{"s":"ok","d":{"auth":null,"expires":1610911538}}}
Default
2021-01-18 01:25:38.880 WIT
[Realtime Database] p:0: from server: {"r":1527,"b":{"s":"ok","d":{"auth":null,"expires":1610911538}}}
Default
2021-01-18 01:25:38.940 WIT
[Realtime Database] p:0: from server: {"r":1528,"b":{"s":"ok","d":{"auth":null,"expires":1610911538}}}
Default
2021-01-18 01:25:39.068 WIT
[Realtime Database] p:0: from server: {"r":1529,"b":{"s":"ok","d":{"auth":null,"expires":1610911538}}}
Default
2021-01-18 01:25:39.112 WIT
[Realtime Database] p:0: from server: {"r":1530,"b":{"s":"ok","d":{"auth":null,"expires":1610911539}}}
Default
2021-01-18 01:25:39.213 WIT
[Realtime Database] p:0: from server: {"r":1531,"b":{"s":"ok","d":{"auth":null,"expires":1610911539}}}

看起来这些行正在刷新身份验证令牌,但它们在这么短的时间内完成了很多次,并且写入操作在这些操作完成之前处于挂起状态。我正在使用来自 App Engine 的默认凭据。

查看https://github.com/firebase/firebase-admin-node/blob/master/src/firebase-app.ts#L136 处的 Firebase Admin SDK 源代码,应在令牌过期前 4 分钟每分钟更新一次令牌。是什么导致了这么多“Auth token refreshed”日志?

App Engine 由多个实例组成,这些实例使用同一个服务帐号来执行 Firebase 操作。 每个实例都有动态的setInterval() 操作和大量的setImmediate() 以防止事件循环被阻塞。

【问题讨论】:

    标签: node.js firebase google-app-engine firebase-realtime-database


    【解决方案1】:

    在我将身份验证从应用程序默认凭据更改为专用服务帐户后,此问题得到解决。

    【讨论】:

      猜你喜欢
      • 2020-09-20
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 2021-07-18
      • 1970-01-01
      • 2015-11-26
      • 2012-02-05
      相关资源
      最近更新 更多