iOS多客户端Firestore的addSnapshotListener偶发20-30秒无更新咨询
我们每天会创建一个约4kB的Firestore文档,该文档会在15分钟的窗口内每10秒定期更新。iOS客户端使用addSnapshotListener订阅该文档的变更,随后会将变更写入该文档的子集合。
这套架构已经平稳运行了约1年,近期客户端数量从300大幅增长到1500左右后,在每天15分钟的更新窗口内会出现一次多数客户端20~30秒收不到快照更新的情况,该时段前后快照接收均正常。
目前仅用少量客户端无法复现该问题,仍在准备压测方案尝试复现现网表现,想咨询该问题是否是Firestore为适配大量快照监听客户端自动扩缩容导致的,恳请各位提供相关建议。
使用版本
- Xcode版本: 13.0 (13A233)
- Firebase SDK版本: 7.11.0
监听器初始化代码
init(subscriber: S, ref: DocumentReference) { self.subscriber = subscriber self.listener = ref.addSnapshotListener(includeMetadataChanges: true) { [weak self] snapshot, error in self?.receive(snapshot: snapshot, error: error) } }
后续排查更新
经过进一步测试,排除了客户端代码异常和Firebase iOS SDK异常的可能性,该问题大概率是快照监听器绑定的文档的子集合写入峰值超过了官方推荐的单集合每秒1000次写入上限导致的。
快照监听器约25秒无更新的现象并非必现,即使用相同文档结构、每秒2000次写入的压测场景也还未能复现该问题。
官方指南明确说明:
单个集合的写入操作速率需保持在每秒1000次以下。
修复方案是对集合做手动分片,保证单个集合的写入速率永远不会超过上限,该方案在客户端规模达到1万、触达数据库整体每秒10000次写入上限前均可用。
目前也仍在监控是否存在500/50/5规则处理不当的情况。
内容的提问来源于stack exchange,提问作者Andreas Seitweger
相关产品推荐
相关产品推荐

