Flutter应用调用Firestore报RESOURCE_EXHAUSTED配额超限错误如何解决?
问题根因
你遇到的RESOURCE_EXHAUSTED报错是Firebase配额耗尽触发的,只出现在Flutter侧是因为当前代码存在重复创建快照监听、无效全表扫描的问题,Angular侧没有这类逻辑所以不会触发配额告警。
解决方案
修复重复发起监听的逻辑
你当前在BlocBuilder的build方法中,只要表单字段合法就会发起watchAllStarted事件,每次事件都会创建一个新的Firestore快照流,旧的流没有被取消,会在后台持续同步数据消耗配额。需要在TripWatcherBloc中新增判断:只有当前没有正在运行的监听、或者监听参数发生变化时,才创建新的流,同时创建新流前必须关闭上一个旧的流。恢复服务端过滤逻辑,禁止全表扫描
你现在注释了所有.where查询条件,每次监听都会拉取trips集合的全量文档,之后再在客户端做过滤,这种方式会消耗远超实际需要的读配额。把注释掉的available_seats、trip_date、route_search_param等过滤条件恢复,直接在Firestore服务端完成过滤,能大幅降低读请求量。补充页面销毁时的资源释放逻辑
把TripsPage从StatelessWidget改成StatefulWidget,在dispose生命周期方法中给TripWatcherBloc发送取消监听的事件,主动关闭当前的快照流,避免页面退出后后台仍在同步无效数据。给表单触发逻辑加防抖
表单字段(出发地、目的地、日期、乘客数)更新时,不要每次状态变化就立刻发起查询,新增300~500ms的防抖逻辑,等用户操作停止后再发起监听请求,避免短时间内产生大量无效请求。核对Firebase配额消耗情况
前往Firebase控制台的使用和计费页面,查看具体耗尽的配额类型:是每秒并发读请求上限、并发连接数上限还是单日总读请求量。Blaze付费方案仅支持超额后付费,不代表没有配额限制,短时间突发请求量过高也会触发该报错,可以根据实际需要申请提升对应配额。
内容的提问来源于stack exchange,提问作者Chanda Mwenechanya

