Firebase数据库失去了Websocket连接,从而导致延迟

jme*_*nke 5 javascript firebase electron firebase-realtime-database

我们在电子应用程序中使用Firebase实时数据库。身份验证正常运行后,第一次执行“设置”或“更新”。但是,在等待一段时间(空闲时间>一分钟)后,执行更新或设置操作会延迟30秒,最多2分钟。

我们正在履行以下承诺:

this.$fbDb.ref().update(updatedNodes).then(() => {
    console.log('Successfully created configuration.')
    resolve()
}).catch((err) => {
    reject(err)
})
Run Code Online (Sandbox Code Playgroud)

Firebase日志显示“ Websocket连接已断开”。请查看以下日志,并注意延迟时间(46秒)18:21:12.226

18:20:26.064 Send.vue?6513:300 Adding the configuration...
18:20:26.065 firebase.js?663c:26 [FIREBASE] 0: update {"path":"/","value":{"/surveys/65/-LDggpvburpfAYAPubqD":{...}}}
18:20:26.091 firebase.js?663c:26 [FIREBASE] event: 
18:20:26.092 firebase.js?663c:26 [FIREBASE] event: 
18:20:26.092 firebase.js?663c:26 [FIREBASE] event: 
18:20:26.093 firebase.js?663c:26 [FIREBASE] event: 
18:20:26.094 firebase.js?663c:26 [FIREBASE] event: 
18:20:26.094 firebase.js?663c:26 [FIREBASE] event: 
18:20:26.095 firebase.js?663c:26 [FIREBASE] event: 
18:21:12.226 firebase.js?663c:26 [FIREBASE] c:0:0:0 Websocket connection was disconnected.
18:21:12.226 firebase.js?663c:26 [FIREBASE] c:0:0:0 WebSocket is closing itself
18:21:12.227 firebase.js?663c:26 [FIREBASE] c:0:0: Realtime connection lost.
18:21:12.227 firebase.js?663c:26 [FIREBASE] c:0:0: Closing realtime connection.
18:21:12.228 firebase.js?663c:26 [FIREBASE] c:0:0: Shutting down all connections
18:21:12.228 firebase.js?663c:26 [FIREBASE] p:0: data client disconnected
18:21:12.229 firebase.js?663c:26 [FIREBASE] p:0: Trying to reconnect in 0ms
18:21:12.229 firebase.js?663c:26 [FIREBASE] 0: onDisconnectEvents
18:21:12.230 firebase.js?663c:26 [FIREBASE] p:0: Making a connection attempt
18:21:12.232 firebase.js?663c:26 [FIREBASE] p:0: Auth token refreshed
18:21:12.237 firebase.js?663c:26 [FIREBASE] getToken() completed. Creating connection.
18:21:12.238 firebase.js?663c:26 [FIREBASE] c:0:1: Connection created
18:21:12.242 firebase.js?663c:26 [FIREBASE] c:0:1:0 Websocket connecting to wss://xxx.firebaseio.com/.ws?v=5&ls=abcde&ns=ourproject
18:21:12.843 firebase.js?663c:26 [FIREBASE] c:0:1:0 Websocket connected.
18:21:12.844 firebase.js?663c:26 [FIREBASE] c:0:1: Realtime connection established.
18:21:12.845 firebase.js?663c:26 [FIREBASE] p:0: connection ready
18:21:12.846 firebase.js?663c:26 [FIREBASE] p:0: {"r":13,"a":"auth","b":{"cred":"token"}}
18:21:12.847 firebase.js?663c:26 [FIREBASE] p:0: Listen on /surveys/65 for default
18:21:13.100 firebase.js?663c:26 [FIREBASE] p:0: {"r":14,"a":"q","b":{"p":"/surveys/65","h":"B9G3P0cJefaRilsIFiMp7NHwhYY="}}
18:21:13.102 firebase.js?663c:26 [FIREBASE] p:0: {"r":15,"a":"m","b":{"p":"/","d":{...}}}
18:21:13.115 firebase.js?663c:26 [FIREBASE] p:0: from server: {"r":13,"b":{"s":"ok","d":{"auth":{"provider":"custom","user_id":"ourUser","cid":"65","token":{"exp":1527614289,"user_id":"ourUser","cid":"65","iat":1527610689,"sub":"ourUser","aud":"ourproject","auth_time":1527610689,"iss":"https://securetoken.google.com/ourproject","firebase":{"identities":{},"sign_in_provider":"custom"}},"uid":"ourUser"},"expires":1527614289}}}
18:21:13.252 firebase.js?663c:26 [FIREBASE] c:0:1: Primary connection is healthy.
18:21:13.253 firebase.js?663c:26 [FIREBASE] p:0: from server: {"r":14,"b":{"s":"ok","d":{}}}
18:21:13.253 firebase.js?663c:26 [FIREBASE] p:0: listen response {"s":"ok","d":{}}
18:21:13.309 firebase.js?663c:26 [FIREBASE] p:0: handleServerMessage m {"p":"surveys/65","d":{...}}}
18:21:13.313 firebase.js?663c:26 [FIREBASE] p:0: from server: {"r":15,"b":{"s":"ok","d":""}}
18:21:13.314 firebase.js?663c:26 [FIREBASE] p:0: m response {"s":"ok","d":""}
18:21:13.339 Send.vue?6513:312 Successfully created configuration.
Run Code Online (Sandbox Code Playgroud)

对于我们和用户而言,延迟是一个很大的问题。我们无法在MacOS或Linux上复制它。

这里发生了什么,我们如何解决这个问题或进一步调试它?

jme*_*nke 1

经过一些试验和研究(#1#2),我们找到了一种防止延迟的“解决方法”:

import {INTERNAL as firebaseDbInternal} from '@firebase/database'

// Force firebase database to use long polling instead of websockets
firebaseDbInternal.forceLongPolling()
Run Code Online (Sandbox Code Playgroud)

警告:这似乎不是一个好的解决方案,因为internal.ts中的注释指出:

客户不应使用这些(功能),否则应意识到它们随时可能会损坏。

我们很乐意提供有关更好解决方案的建议 - 只要没有更好的答案,我就会接受这个答案作为解决问题的最佳方法。

  • 可能会发生什么情况导致您的应用程序关闭 WS 流量?我还看到它正在刷新身份验证令牌,该令牌是否已过期?也许在加载时强制刷新令牌会有所帮助?长轮询有效,但(IMO)是一个后备.. (2认同)