【发布时间】: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