3.2 十个高频问题门诊(下):运行与计费类
和上一节的分工
上一节的问题集中在项目起步阶段,本节的五个问题则集中在项目跑起来之后:数据开始有了真实读写,函数开始承接真实流量,账单开始真实跳动。这类问题的共同特征是复现依赖运行环境,本地未必能看到,所以处方里会更依赖控制台里的数据与工具。下面逐问开诊。
五问门诊:症状、病因与处方
权限被拒:十有八九是安全规则
症状:读写数据时报 permission denied,代码看起来完全正确,换台设备依然如此。
病因:Firestore 或实时数据库的安全规则拦下了请求。规则默认拒绝未授权访问,很多人开发期改过规则又忘了改回来,或者规则的判断条件和实际登录状态对不上。
处方: - 先去控制台规则编辑器通读当前规则,确认匹配逻辑和自己的预期 - 检查请求方是否真的完成了登录,匿名登录也算登录,未登录请求会被大多数规则拒绝 - 用规则模拟器做对照验证:同一条请求,模拟器里过不过、真机上过不过,差异就是线索 - 开发期可以临时放宽规则观察现象,但上线前必须收紧
检查清单:当前规则内容是否如你所想、登录状态是否有效、请求路径是否超出规则允许的范围、时间类条件是否因时区或服务器时间产生偏差。
查询报错要求建索引
症状:复合查询一跑就报错,错误信息里明确提示需要索引,并附有链接。
病因:涉及范围比较加排序,或多个字段组合过滤的查询需要复合索引。单字段索引自动维护,复合索引不会自动创建。
处方: - 点开报错信息附带的链接,控制台会预填好索引定义,一键创建即可 - 大数据量下索引构建需要时间,等状态变为可用再重测 - 把索引定义导出进版本库,换环境或重建项目时直接部署,省得再踩一遍
云函数莫名超时或内存爆掉
症状:函数本地跑得欢,一部署不是超时就是内存超限被强制终止。
病因:两类常见根因。一是默认运行配置对当前任务量确实不够;二是代码里有同步阻塞写法,比如异步调用没有正确等待、HTTP 函数迟迟不返回响应,导致函数提前被冻结甚至重复执行。
处方: - 核对函数的运行配置:内存规格与执行时长上限是否匹配任务量 - 排查阻塞写法:所有异步调用是否正确等待、响应是否及时返回 - 把耗时工作拆小:大任务分片处理,重活用队列思路而不是单函数硬扛 - 避免一次性把大数据全量载入内存,能流式就流式
账单突增:三个常见元凶
症状:用量突然翻倍甚至更多,账单曲线陡增,代码却没大改。
病因:通常是三种情况。监听器没清理,客户端反复叠加长连接;函数互相触发形成循环,A 写库触发 B,B 又写回触发 A;或者公开接口没做校验被灌入垃圾数据,读写量跟着暴涨。
处方: - 打开控制台用量页,按产品和时间维度定位是哪一项在涨:读、写、存储还是出站流量 - 客户端检查监听器的取消逻辑,页面销毁、用户登出时必须退订 - 函数侧检查触发链,写入路径上明确排除会再次触发自己的文档 - 公开接口加校验与限流,别让外部随意写库
推送收不到:先分清前台后台
症状:通知时灵时不灵,或者彻底收不到,多设备表现还不一致。
病因:消息投递和三件事强相关:应用在前台和后台时消息的处理路径本来就不同;设备上的注册令牌会过期或失效;国产设备还有系统级推送通道的差异问题。
处方: - 前台收不到通知属正常现象,前台消息需要应用内自行处理展示 - 后台也收不到时,先检查令牌的获取与上报逻辑,令牌更新后要同步到服务端 - 测试时分场景做:应用在前台、退到后台、进程被杀,三种状态分别验证 - 国产设备上确认系统层通知权限与厂商通道配置,实际到达率以真机表现为准
本节速查表
| 症状 | 首查方向 | 关键动作 |
|---|---|---|
| permission denied | 安全规则 | 读规则、验登录、用模拟器 |
| 要求索引的报错 | 复合索引缺失 | 控制台一键创建 |
| 函数超时或内存超限 | 运行配置与阻塞写法 | 调配置、理异步 |
| 用量与账单陡增 | 监听器、循环触发、垃圾数据 | 用量页定位再逐项排查 |
| 推送时有时无 | 前后台差异与令牌失效 | 分场景测试、同步令牌 |
运行期问题的共同套路是:先定位、再复现、后修复。用量页和规则模拟器是这一节最好用的两件工具,遇到说不清的问题,先让数据说话,再动手改代码。
