1.6 KiB
1.6 KiB
BugCollect 摄取防雪崩设计
目标
线上同一故障可能在短时间内由大量设备同时触发。摄取链路必须保护数据库和服务线程, 同时不能让 BugCollect 故障阻断宿主 App。
权威链路
- SDK 本地按指纹采样和限频,批量上报最多 30 条。
- 服务端按
appKey统计固定窗口内的事件数,默认每分钟 6000 条。 - 多实例部署使用 Redis Lua 原子计数;Redis 不可用时退回进程内窗口,继续保护当前实例。
- 超限返回 HTTP 429、
message=BUGCOLLECT_RATE_LIMITED和标准Retry-After秒数。 - RN/Android SDK 保留原队列,按
Retry-After冷却,最长一小时;冷却期间不重复请求。 BUGCOLLECT_DISABLED仍表示租户关闭服务,SDK 清队列并停用。它与临时限流不能混用。
配置
| 环境变量 | 默认值 | 说明 |
|---|---|---|
BUGCOLLECT_MAX_EVENTS_PER_MINUTE |
6000 |
单个 appKey 每个窗口允许的事件数,最小 30 |
BUGCOLLECT_RATE_WINDOW_SECONDS |
60 |
固定窗口长度,最小 10 秒 |
限流属于平台容量保护,不是租户发布配置。租户平台不向开发者暴露“上传网络建议”或 让租户关闭服务端保护。
验收
- 单批 31 条必须在 Bean Validation 阶段拒绝。
- Redis 可用时,多实例共享同一 appKey 计数。
- Redis 不可用时,单实例超过本地额度仍返回 429。
- 429 必须携带正整数
Retry-After。 - SDK 收到 429 后不得丢队列、立即重试或向宿主业务线程抛未处理异常。
- 服务关闭返回 403
BUGCOLLECT_DISABLED,行为不受限流改动影响。