Files
junhong_cmp_fiber/openspec/changes/finalize-unified-stop-resume-rule/tasks.md
邹进 42e881576d
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m33s
feat: 卡网关按运营商账户限流并记录停复机调用
- 新增网关限流:按本系统运营商账户(卡 carrier_id)→ 限流组 → 操作限制每秒请求数,每次 HTTP 尝试计量,默认限流、仅后台人工点击/通道阈值/自动续费/手动刷新豁免;支持只统计与拦截两种模式,默认只统计
- Asynq 遇限流不计失败、固定短延迟重试;轮询任务与停复机业务重试遇限流短延迟重排
- 停机、复机不再使用网关内部重试,只发一次请求
- 网关返回结构化错误;新增上游错误分类规则表与测试接口
- 新增按月分区的停复机记录表:系统自动停复机只写记录,不再写统一审计与集成日志;普通轮询查询不再写集成日志
- 新增限流组、错误分类、停复机记录、按账户调用统计与枚举后台接口
- 迁移 000243~000246;同步 OpenSpec 提案(含后续 6 个 change)与技术方案、工程约束
2026-10-24 15:06:41 +09:00

3.8 KiB
Raw Blame History

0. 前置确认

  • 0.1 确认 rebuild-card-traffic-metering-and-stop-resume 已归档并上线生产(总开关可仍为关闭);第 1、3 个 Change 已上线。

第一次发布:演练与口径补齐(总开关仍关闭,行为不变)

1. 迁移

  • 1.1 新增成对迁移:tb_gateway_error_classification 增加 auto_disable_polling boolean not null default false,为"已销户""风险停机"类终态规则置位;down 删列。

2. 规则演练

  • 2.1 新增演练 Query:按批读取卡与资产数据,复用新规则判断函数(不受总开关影响,始终按新规则判断),支持假设的实名管控配置;只读。
  • 2.2 GET /stop-resume-rule/dry-run(运营商账户、停机原因筛选,汇总 + 分页明细),仅超级管理员与平台用户;导出场景 stop_resume_rule_dry_run。
  • 2.3 同步路由与文档生成入口,重新生成接口文档。

3. 风险停机与已销户关闭轮询

  • 3.1 ShouldStopPollingForRisk 去掉独立卡限制,只关闭该卡自身 enable_polling,不级联设备。
  • 3.2 停复机调用失败时按错误分类查 auto_disable_polling:置位则不重试、关闭该卡轮询、回写 gateway_extend、写审计。
  • 3.3 错误分类接口增加 auto_disable_polling 字段,非终态类别勾选时拒绝。

4. 第一次发布的编译与验证

  • 4.1 gofmt -w;go build ./cmd/api ./cmd/worker 通过;openspec validate finalize-unified-stop-resume-rule 通过。
  • 4.2 测试环境:演练不改任何状态;开启总开关后抽取 not_realname、carrier_stopped、manual、停因为空各若干张,实际评估结果与演练一致。
  • 4.3 测试环境:绑定设备的卡返回已销户时只关该卡轮询;复机返回风险停机时不重试并关闭轮询;号码封存不关闭轮询。

5. 开启新规则(运营与维护者,第一次发布上线后)

  • 5.1 为需要实名的运营商账户设置 realname_control_enabled = 1。
  • 5.2 生产执行演练并导出明细,运营确认"将被复机 / 将被停机"清单;需保持停机的卡先关闭轮询。
  • 5.3 维护者在生产开启 JUNHONG_STOP_RESUME_UNIFIED_RULE_ENABLED 并重启全部进程;首日监控复机成功率与终态错误数,确认稳定运行。

第二次发布:转正(新规则在生产稳定运行后)

6. 删除总开关与旧口径

  • 6.1 stop_resume_unified.go 并入主逻辑:删除 unifiedStopResumeEnabled 与各分支,autoResumableStopReason 恒为真,autoControlSuspended、unifiedRealnameOK 无条件生效。
  • 6.2 stop_resume_service.go 删除旧口径:isRealnameOK 行业卡与 realname_policy 分支、isPollingStopReason 限定、ListByDeviceIDAndPollingStopReasons 的调用。
  • 6.3 删除 pkg/config/config.go、loader.go、defaults/config.yaml 的总开关,.gitea/workflows/deploy.yaml 与 docker-compose.prod.yml 中的 JUNHONG_STOP_RESUME_UNIFIED_RULE_ENABLED。
  • 6.4 通道阈值新周期复机条件去掉开关分支,固定为新规则复机条件。

7. 实名轮询

  • 7.1 polling_realname_handler.go:删除按行业卡跳过;卡所属账户未开实名管控时跳过查询并按正常间隔重入队;账户查询失败按可恢复失败处理。

8. 第二次发布的编译与验证

  • 8.1 gofmt -w;go build ./cmd/api ./cmd/worker 通过;全仓检索无 UnifiedRuleEnabled 残留;openspec validate 与 openspec doctor --json 通过。
  • 8.2 测试环境:未开管控账户不查实名;开启管控账户的行业卡查实名并按未实名停机;通道阈值新周期解锁后按新规则复机或只解锁;停复机行为与第一次发布开启总开关后一致。