为什么实时数据库更新有时会因令牌更新的爆发而延迟?
Why is Realtime Database update sometimes delayed by the burst of token renewal?
在一个 Node.js 后台应用程序中 运行 定期从 App Engine 写入 Firebase 实时数据库,有时我会遇到巨大的延迟,可能会占用将近一分钟的时间。执行写操作的代码很简单:
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 后台应用程序中 运行 定期从 App Engine 写入 Firebase 实时数据库,有时我会遇到巨大的延迟,可能会占用将近一分钟的时间。执行写操作的代码很简单:
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()
以防止事件循环被阻塞。
在我将身份验证从应用程序默认凭据更改为专用服务帐户后,此问题已解决。