Files
junhong_cmp_fiber/openspec/changes/archive/2026-02-10-polling-system-implementation/proposal.md
huang 804145332b
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 44s
chore: 归档轮询系统实现变更 (polling-system-implementation)
已完成千万级卡规模轮询系统的完整实现和集成测试验证,将变更归档到 openspec/changes/archive/2026-02-10-polling-system-implementation/

主要成果:
- 三大轮询任务:实名检查、卡流量检查、套餐流量检查
- 快速启动(<10秒)和渐进式初始化
- 完整运营工具:配置管理、并发控制、监控面板、告警系统、数据清理、手动触发
- 任务完成度:215/216(99.5%)
- 所有 24 个新增接口已生成 OpenAPI 文档

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 10:28:47 +08:00

8.5 KiB
Raw Blame History

Why

当前系统管理百万级别1000万+)的 IoT 卡资产,需要定期检查卡的实名状态、流量使用情况和套餐流量消耗,以实现自动化监控、及时停机和状态同步。现有系统缺乏轮询机制,无法高效处理大规模卡的定期检查需求,导致需要人工干预或依赖外部触发,运营成本高且响应不及时。本变更实现基于 Redis Sorted Set 的高性能轮询调度系统,支持灵活配置、动态并发控制、监控告警和数据清理,满足百万级卡量的自动化管理需求。

What Changes

  • 新增轮询调度系统:基于 Redis Sorted Set 实现时间驱动的轮询队列,支持百万级卡的高效调度
  • 新增三种轮询处理器
    • 实名检查轮询:定期调用 Gateway API 查询卡的实名状态,支持梯度配置(未实名卡高频、已实名卡低频)
    • 卡流量检查轮询:定期查询卡的流量使用情况,处理跨月流量计算(自然月重置),记录流量历史
    • 套餐流量检查轮询:检查套餐使用情况(单卡套餐、设备级套餐),超额自动停机
  • 新增轮询配置管理:支持按卡状态、卡类型、运营商配置不同的轮询策略和间隔时间
  • 新增并发控制机制:基于 Redis 实现动态并发数调整,支持通过管理接口实时修改,无需重启 Worker
  • 新增监控面板接口:实时查看轮询队列状态、任务执行统计、成功率、平均耗时等监控指标
  • 新增告警系统支持配置告警规则队列积压、成功率、耗时多种通知渠道邮件、短信、Webhook
  • 新增数据清理机制:定期清理流量历史记录、操作日志等数据,支持配置保留天数
  • 新增手动触发接口:支持手动触发单张或批量卡的立即检查,最高优先级处理
  • 修改 IotCard 模型:增加月流量追踪字段(current_month_usage_mb, current_month_start_date, last_month_total_mb),用于处理跨月流量计算
  • 修改 Worker 进程集成轮询调度器支持渐进式初始化10秒启动后台异步加载卡数据
  • 新增管理接口:提供轮询配置 CRUD、并发控制调整、手动触发、监控面板、告警管理等完整的管理接口

Capabilities

New Capabilities

  • polling-configuration: 轮询配置管理 - 支持创建、查询、更新、删除轮询配置,配置卡匹配条件(卡状态、卡类型、运营商)和检查间隔(实名、流量、套餐),支持优先级和启用/禁用控制
  • polling-scheduler: 轮询调度器 - 核心调度引擎,负责读取配置、匹配卡、计算下次检查时间、生成 Asynq 任务、管理 Redis 队列,支持渐进式初始化和懒加载机制
  • polling-realname-check: 实名检查轮询 - 定期调用 Gateway API 查询卡实名状态,更新数据库和 Redis 缓存,支持状态变更时自动切换轮询配置,处理行业卡无需实名的特殊逻辑
  • polling-carddata-check: 卡流量检查轮询 - 定期查询卡流量使用情况,处理跨月流量计算(自然月重置),记录流量历史到 data_usage_records 表,触发关联套餐的流量检查
  • polling-package-check: 套餐流量检查轮询 - 检查套餐流量使用(单卡套餐直接读取、设备级套餐汇总所有卡),判断是否超额(基于虚流量),超额自动调用 Gateway 停机并更新卡状态
  • polling-concurrency-control: 并发控制管理 - 基于 Redis 信号量实现动态并发数控制,支持分类型配置(实名、流量、套餐、停复机),提供管理接口实时调整并发数,无需重启 Worker
  • polling-monitoring: 监控面板 - 提供轮询系统监控接口,查询队列状态(队列长度、逾期任务数、下个待处理任务)、任务执行统计(成功率、平均耗时、总执行次数)、实时并发数等监控指标
  • polling-alert: 告警系统 - 支持配置告警规则队列积压、成功率、平均耗时、正在处理任务数支持多种告警级别info/warning/error/critical和通知渠道邮件、短信、Webhook定期检查规则并发送告警通知
  • data-cleanup: 数据清理 - 定期清理流量历史记录(data_usage_records)、操作日志等数据,支持配置保留天数,使用定时任务每日凌晨执行清理
  • polling-manual-trigger: 手动触发 - 提供手动触发接口,支持单张或批量卡的立即检查(实名、流量、套餐),使用独立的高优先级队列,确保立即处理

Modified Capabilities

  • iot-card: IoT 卡管理 - 增加月流量追踪字段(current_month_usage_mb:本月已用流量,current_month_start_date:本月开始日期,last_month_total_mb:上月结束时总流量),用于处理 Gateway 返回的自然月流量总量并计算增量,支持跨月流量计算

Impact

数据模型变更

新增表

  • tb_polling_config:轮询配置表,存储轮询策略(卡匹配条件、检查间隔、优先级)
  • tb_polling_concurrency_config:并发控制配置表,存储各类型任务的最大并发数
  • tb_polling_alert_rule:告警规则表,存储告警配置(指标类型、阈值、通知渠道)
  • tb_data_cleanup_config:数据清理配置表,存储各表的保留天数

修改表

  • tb_iot_card:增加字段 current_month_usage_mbcurrent_month_start_datelast_month_total_mb

Redis 数据结构

  • 轮询队列Sorted Set
    • polling:queue:realname:实名检查队列
    • polling:queue:carddata:卡流量检查队列
    • polling:queue:package:套餐流量检查队列
  • 卡信息缓存Hashpolling:card:{card_id},缓存卡的基本信息和轮询状态
  • 配置缓存Stringpolling:configs缓存所有轮询配置JSON 格式)
  • 配置匹配索引Setpolling:config:cards:{config_id},记录匹配该配置的所有卡 ID
  • 并发控制Stringpolling:concurrency:config:{type}polling:concurrency:current:{type}
  • 手动触发队列Listpolling:manual:{type},高优先级手动触发队列
  • 监控统计Hashpolling:stats:{type},存储监控指标

系统集成

  • Worker 进程:集成轮询调度器 Goroutine启动时快速初始化10秒后台异步加载卡数据20-30分钟
  • Asynq 任务队列:新增任务类型 iot:realname:checkiot:carddata:checkiot:package:check,新增队列 iot_polling_realnameiot_polling_carddataiot_polling_package
  • Gateway 集成:调用已有的 Gateway HTTP 接口(QueryRealnameStatusQueryFlowStopCardStartCard

API 接口

新增管理接口/api/admin/polling-*

  • 轮询配置管理CRUD、启用/禁用
  • 并发控制管理:查询、更新并发数
  • 手动触发:单卡/批量立即检查
  • 监控面板:总览统计、队列状态、任务详情
  • 告警管理CRUD 告警规则

性能影响

  • 内存占用Redis 增加约 3-5 GB 内存1000万卡 × 200字节缓存 + Sorted Set 队列)
  • 数据库负载渐进式初始化平缓负载每秒10万行 + 1秒休息运行时查询负载分散到轮询周期
  • 网络带宽Gateway API 调用频率可控(通过并发数和轮询间隔配置)
  • Worker 进程:新增 1 个调度器 GoroutineAsynq Worker 并发数可配置

依赖项

  • 已有依赖Gateway Clientinternal/gateway、Asynqpkg/queue、Redis、PostgreSQL
  • 无新增外部依赖

测试影响

  • 单元测试:轮询配置匹配逻辑、跨月流量计算逻辑、并发控制逻辑
  • 集成测试:轮询处理器端到端测试(含 Gateway Mock、配置变更影响测试、手动触发测试
  • 性能测试百万级卡初始化性能测试、Redis 队列性能测试、并发控制压力测试

运维影响

  • 部署要求Worker 进程需要访问 Gateway API网络连通性
  • 配置管理:新增轮询配置、并发控制配置、告警规则配置(通过管理接口或数据库初始化)
  • 监控告警需要配置告警通知渠道邮件、短信、Webhook
  • 数据备份:轮询配置表、告警规则表需要备份

向后兼容性

  • 完全向后兼容,不影响现有 API 和业务逻辑
  • 新增字段有默认值,不影响已有数据
  • 轮询系统可独立启用/禁用(通过配置)