Firestore离线读取相同文档加载耗时波动大潜在Bug排查
异常诱因
- 离线写入触发无效同步请求
Firestore执行任意写入操作时,默认会优先尝试和服务端同步变更,即使是无修改的空写入也会触发该逻辑。离线状态下同步请求会直接失败,每次失败都会触发指数退避机制。 - 指数退避累积阻塞请求
你每次循环执行写入操作都会触发一次同步失败,Firestore的指数退避策略会将下一次同步请求的等待时长按指数级拉长,还会叠加随机抖动值。后续的读取请求使用默认策略时会先尝试请求服务端,直接被已经累积的退避计时器阻塞,你观测到的长耗时本质就是等待退避计时器到期的时间,和你贴出的ExponentialBackoff日志中的退避时长完全匹配。 - 默认读写策略优先级问题
Firestore默认读取策略为default,优先级为服务端优先,只有服务端请求失败后才会回退到本地缓存。结合你提供的补充信息,缓存总大小仅115KB,排除了本地缓存读取本身的性能问题,长耗时完全来自网络请求相关的阻塞逻辑。
解决方案
- 业务层过滤空写入
写入前先对比待写入内容和本地已缓存的文档内容,完全一致时直接跳过写入操作,从根源上避免触发不必要的同步请求。 - 显式指定读写源
离线场景下显式指定读取源为本地缓存,无需经过网络请求逻辑,耗时可稳定在毫秒级,各端示例代码:- 安卓:
document.get(Source.CACHE) - iOS:
document.getDocument(source: .cache) - Web:
doc.get({ source: 'cache' })
- 安卓:
- 离线状态下关闭自动同步
检测到设备无网络时,调用Firestore的disableNetwork()接口暂停自动同步,网络恢复后调用enableNetwork()恢复同步,避免离线状态下产生大量无效同步请求触发退避。 - 调整退避参数(可选,仅v24.0.0以上SDK支持)
如果业务场景确实需要频繁离线写入,可以通过Firestore配置项调整指数退避的基础延迟上限,避免退避时长累积到过高的水平。
内容的提问来源于stack exchange,提问作者J.norberg
相关产品推荐
相关产品推荐

