Files
junhong_cmp_fiber/openspec/changes/remove-device-protect-period/proposal.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.1 KiB
Raw Blame History

Why

后台对设备停机或复机时会设置 1 小时保护期,保护期内阻止相反的人工操作,protect 轮询发现方向不一致时强制停复机。但自动停复机不检查保护期,保护期内会出现"自动停机 → 保护期强制复机 → 再自动停机"的反复翻转,且与"只要符合规则就自动停复机"的原则冲突。本 Change 是《轮询按运营商账户限流技术方案》第五部分第 3 节第 3 步:整体下线保护期,为后续调度与停复机改造减负。

What Changes

  • BREAKING 后台设备停机、复机不再设置保护期,也不再因保护期拒绝相反操作;单卡手动停复机去掉保护期检查。
  • BREAKING 下线 polling:protect 轮询任务类型:不再注册、调度、统计与监控;轮询并发配置与任务类型名称不再包含保护期检查。
  • 轮询配置的 protect_check_interval 不再读写,接口不再接受与返回该字段;数据库列保留,列注释标记已废弃。
  • 卡字段 last_protect_check_at 不再读写;数据库列保留,列注释标记已废弃。
  • 资产接口(后台与 C 端)的 device_protect_status 字段保留,固定返回"无保护期"并在接口文档标记废弃,待前端与老版本小程序不再读取后另行删除。
  • 停机原因常量 protect_period 保留(历史数据与对外开放接口映射仍需要),不再产生新值;删除 RedisDeviceProtectKey、DeviceProtectPeriodDuration。
  • 存量保护期 Redis key 上线后自然过期(TTL 1 小时),不做迁移。

Capabilities

New Capabilities

(无)

Modified Capabilities

  • polling-operations:"轮询并发配置覆盖实际任务"去掉 protect;"轮询任务类型名称可读"去掉"保护期检查"。
  • asset-device:新增"设备停复机不设保护期"要求,并约定 device_protect_status 字段的兼容返回。

Impact

  • 依赖:无前置 Change。第 4 个 Change 改写通道阈值规范时一并去掉"保护期强制复机"表述。
  • 数据库:新增成对迁移,只更新 tb_polling_config.protect_check_interval、tb_iot_card.last_protect_check_at 的列注释(标记废弃);不删列、不改数据。
  • 代码:删除 internal/task/polling_protect_handler.go 与 pkg/queue/handler.go 中的注册;internal/service/device/service.go(不设、不查保护期);internal/service/iot_card/stop_resume_service.go(手动停复机去掉保护期检查);stop_resume_unified.go 删除 ProtectCheckSkipsForRealname;internal/polling/config_manager.go、initializer.go、调度器去掉 protect 类型;internal/model/dto/polling_config_dto.go、asset_dto.go、client_asset_dto.go、internal/service/asset/service.go;pkg/constants。
  • 接口:/polling-configs 不再含 protect_check_interval;/polling-concurrency 不再含 protect;资产详情 device_protect_status 固定为无保护期并标记废弃。重新生成接口文档。
  • 前端:轮询配置页去掉保护期间隔;资产详情(后台与 C 端)不再展示保护期状态。