All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m35s
实现功能: - 实名状态检查轮询(可配置间隔) - 卡流量检查轮询(支持跨月流量追踪) - 套餐检查与超额自动停机 - 分布式并发控制(Redis 信号量) - 手动触发轮询(单卡/批量/条件筛选) - 数据清理配置与执行 - 告警规则与历史记录 - 实时监控统计(队列/性能/并发) 性能优化: - Redis 缓存卡信息,减少 DB 查询 - Pipeline 批量写入 Redis - 异步流量记录写入 - 渐进式初始化(10万卡/批) 压测工具(scripts/benchmark/): - Mock Gateway 模拟上游服务 - 测试卡生成器 - 配置初始化脚本 - 实时监控脚本 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
8.6 KiB
8.6 KiB
轮询系统
概述
轮询系统是 IoT 卡管理平台的核心模块,负责定期检查卡的实名状态、流量使用情况和套餐流量余额。系统采用分布式架构,支持高并发处理和动态配置。
核心功能
1. 实名检查轮询(Realname Check)
- 定期查询卡的实名认证状态
- 自动跳过行业卡(无需实名)
- 状态变化时重新匹配配置
2. 流量检查轮询(Carddata Check)
- 定期查询卡的流量使用情况
- 支持跨月流量自动重置
- 记录流量使用历史
3. 套餐检查轮询(Package Check)
- 监控套餐流量使用率
- 超额自动停机(>100%)
- 临近超额预警(>=95%)
系统架构
┌─────────────────────────────────────────────────────────────────┐
│ Worker 进程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Scheduler │ │ AlertChecker │ │ CleanupTask │ │
│ │ 调度器 │ │ 告警检查器 │ │ 清理任务 │ │
│ └──────┬───────┘ └──────────────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Asynq 任务队列 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Realname │ │ Carddata │ │ Package │ │
│ │ Handler │ │ Handler │ │ Handler │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Redis │
│ - 轮询队列 (Sorted Set) │
│ - 手动触发队列 (List) │
│ - 卡信息缓存 (Hash) │
│ - 配置缓存 │
│ - 并发信号量 │
│ - 监控统计 │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ PostgreSQL │
│ - tb_polling_config │
│ - tb_polling_concurrency_config │
│ - tb_polling_alert_rule │
│ - tb_polling_alert_history │
│ - tb_data_cleanup_config │
│ - tb_data_cleanup_log │
│ - tb_polling_manual_trigger_log │
│ - tb_data_usage_record │
└─────────────────────────────────────┘
快速启动
1. 数据库迁移
make migrate-up
2. 初始化配置
psql $DATABASE_URL -f scripts/init_polling_config.sql
3. 启动 Worker
go run cmd/worker/main.go
配置说明
轮询配置(tb_polling_config)
| 字段 | 说明 | 默认值 |
|---|---|---|
| name | 配置名称 | - |
| priority | 优先级(数字越大越优先) | 0 |
| carrier_id | 运营商 ID(可选) | - |
| status | 卡状态条件(可选) | - |
| card_category | 卡类别条件(可选) | - |
| realname_check_interval | 实名检查间隔(秒) | 3600 |
| carddata_check_interval | 流量检查间隔(秒) | 7200 |
| package_check_interval | 套餐检查间隔(秒) | 14400 |
| is_enabled | 是否启用 | true |
并发控制配置(tb_polling_concurrency_config)
| 任务类型 | 默认并发数 | 说明 |
|---|---|---|
| realname | 50 | 实名检查并发数 |
| carddata | 100 | 流量检查并发数 |
| package | 30 | 套餐检查并发数 |
API 接口
轮询配置管理
POST /api/admin/polling-configs- 创建配置GET /api/admin/polling-configs- 配置列表GET /api/admin/polling-configs/:id- 配置详情PUT /api/admin/polling-configs/:id- 更新配置DELETE /api/admin/polling-configs/:id- 删除配置
并发控制管理
GET /api/admin/polling-concurrency- 获取并发配置PUT /api/admin/polling-concurrency/:type- 更新并发数POST /api/admin/polling-concurrency/reset- 重置信号量
监控面板
GET /api/admin/polling-stats- 总览统计GET /api/admin/polling-stats/queues- 队列状态GET /api/admin/polling-stats/tasks- 任务统计GET /api/admin/polling-stats/init-progress- 初始化进度
告警管理
POST /api/admin/polling-alert-rules- 创建告警规则GET /api/admin/polling-alert-rules- 规则列表PUT /api/admin/polling-alert-rules/:id- 更新规则DELETE /api/admin/polling-alert-rules/:id- 删除规则GET /api/admin/polling-alert-history- 告警历史
数据清理
POST /api/admin/data-cleanup-configs- 创建清理配置GET /api/admin/data-cleanup-configs- 配置列表PUT /api/admin/data-cleanup-configs/:id- 更新配置DELETE /api/admin/data-cleanup-configs/:id- 删除配置POST /api/admin/data-cleanup/trigger- 手动触发清理GET /api/admin/data-cleanup/preview- 清理预览GET /api/admin/data-cleanup/progress- 清理进度
手动触发
POST /api/admin/polling-manual-trigger/single- 单卡触发POST /api/admin/polling-manual-trigger/batch- 批量触发POST /api/admin/polling-manual-trigger/by-condition- 条件触发GET /api/admin/polling-manual-trigger/status- 触发状态GET /api/admin/polling-manual-trigger/history- 触发历史POST /api/admin/polling-manual-trigger/cancel- 取消触发
Redis Key 说明
| Key 模式 | 类型 | 说明 |
|---|---|---|
| polling:queue:realname | Sorted Set | 实名检查队列 |
| polling:queue:carddata | Sorted Set | 流量检查队列 |
| polling:queue:package | Sorted Set | 套餐检查队列 |
| polling:manual:{type} | List | 手动触发队列 |
| polling:card:{card_id} | Hash | 卡信息缓存 |
| polling:configs | Hash | 配置缓存 |
| polling:concurrency:config:{type} | String | 并发配置 |
| polling:concurrency:current:{type} | String | 当前并发数 |
| polling:stats:{type} | Hash | 监控统计 |
| polling:init:progress | Hash | 初始化进度 |
性能指标
- Worker 启动时间:< 10 秒
- 渐进式初始化:每批 10 万张卡,间隔 1 秒
- API 响应时间:P95 < 200ms
- 数据库查询:< 50ms