# 轮询系统

## 概述

轮询系统是 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. 数据库迁移

```bash
make migrate-up
```

### 2. 初始化配置

```bash
psql $DATABASE_URL -f scripts/init_polling_config.sql
```

### 3. 启动 Worker

```bash
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

## 相关文档

- [部署文档](deployment.md)
- [运维文档](operations.md)
