# 轮询系统部署文档

## 部署前准备

### 1. 环境要求

| 组件 | 最低版本 | 推荐版本 |
|------|----------|----------|
| PostgreSQL | 14.0 | 14+ |
| Redis | 6.0 | 6.0+ |
| Go | 1.21 | 1.21+ |

### 2. 配置检查

确保以下环境变量已配置：

```bash
# 数据库配置
JUNHONG_DATABASE_HOST
JUNHONG_DATABASE_PORT
JUNHONG_DATABASE_USER
JUNHONG_DATABASE_PASSWORD
JUNHONG_DATABASE_DBNAME

# Redis 配置
JUNHONG_REDIS_ADDRESS
JUNHONG_REDIS_PORT
JUNHONG_REDIS_PASSWORD
JUNHONG_REDIS_DB
```

## 部署步骤

### 步骤 1: 数据库迁移

```bash
# 检查迁移状态
make migrate-status

# 执行迁移
make migrate-up

# 验证迁移结果
psql $DATABASE_URL -c "SELECT tablename FROM pg_tables WHERE tablename LIKE 'tb_polling%' OR tablename LIKE 'tb_data_%';"
```

应该看到以下表：
- 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

### 步骤 2: 初始化配置

```bash
# 执行初始化脚本
psql $DATABASE_URL -f scripts/init_polling_config.sql

# 验证初始化结果
psql $DATABASE_URL -c "SELECT config_name, priority, status FROM tb_polling_config ORDER BY priority;"
```

应该看到 5 条默认配置：
1. 未实名卡轮询 (priority: 10)
2. 行业卡轮询 (priority: 15)
3. 已实名卡轮询 (priority: 20)
4. 已激活卡轮询 (priority: 30)
5. 默认轮询配置 (priority: 100)

### 步骤 3: 验证 Redis 连接

```bash
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD ping
```

### 步骤 4: 编译应用

```bash
# 编译 API 服务
go build -o bin/api cmd/api/main.go

# 编译 Worker 服务
go build -o bin/worker cmd/worker/main.go
```

### 步骤 5: 灰度发布

**阶段 1: 单节点测试**

1. 先在一台 Worker 上部署新版本
2. 观察日志和监控指标 30 分钟
3. 确认无异常后继续

```bash
# 启动单个 Worker
./bin/worker &

# 检查日志
tail -f logs/worker.log | grep -i polling
```

**阶段 2: 滚动部署**

1. 逐步替换其他 Worker 节点
2. 每个节点间隔 5 分钟
3. 持续监控告警

### 步骤 6: 验证部署

```bash
# 检查调度器状态
curl http://localhost:3000/api/admin/polling-stats/init-progress

# 检查队列状态
curl http://localhost:3000/api/admin/polling-stats/queues

# 检查配置列表
curl http://localhost:3000/api/admin/polling-configs
```

## 配置调整

### 调整并发数

```bash
# 查看当前并发配置
curl http://localhost:3000/api/admin/polling-concurrency

# 调整实名检查并发数为 80
curl -X PUT http://localhost:3000/api/admin/polling-concurrency/realname \
  -H "Content-Type: application/json" \
  -d '{"max_concurrency": 80}'
```

### 调整轮询间隔

通过管理后台或 API 修改 tb_polling_config 表中的间隔配置。

## 回滚策略

### 快速回滚

1. 停止所有 Worker
2. 回滚代码版本
3. 执行数据库回滚（如需）
4. 重启 Worker

```bash
# 停止 Worker
pkill -f "bin/worker"

# 数据库回滚（如需）
make migrate-down STEP=9

# 清理 Redis 轮询相关数据
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD --scan --pattern "polling:*" | xargs redis-cli DEL

# 重新部署旧版本
./bin/worker-old &
```

### 数据清理

如果需要完全清理轮询系统数据：

```sql
-- 清理轮询配置
TRUNCATE TABLE tb_polling_config CASCADE;
TRUNCATE TABLE tb_polling_concurrency_config CASCADE;
TRUNCATE TABLE tb_polling_alert_rule CASCADE;
TRUNCATE TABLE tb_polling_alert_history CASCADE;
TRUNCATE TABLE tb_data_cleanup_config CASCADE;
TRUNCATE TABLE tb_data_cleanup_log CASCADE;
TRUNCATE TABLE tb_polling_manual_trigger_log CASCADE;
TRUNCATE TABLE tb_data_usage_record CASCADE;
```

```bash
# 清理 Redis
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD KEYS "polling:*" | xargs redis-cli DEL
```

## 常见问题

### Q1: Worker 启动缓慢

A: 检查数据库和 Redis 连接。正常情况下 Worker 应在 10 秒内完成启动。

### Q2: 队列积压严重

A: 增加并发数，或检查是否有 Gateway 接口响应慢的问题。

### Q3: 任务重复执行

A: 检查 Redis 连接稳定性，确保分布式锁正常工作。

### Q4: 迁移失败

A: 检查迁移日志，确认数据库权限。可能需要手动修复 schema_migrations 表。

## 监控建议

部署后建议配置以下监控：

1. **队列长度**：polling:queue:* 的 ZCARD
2. **任务成功率**：统计 success/total 比率
3. **平均耗时**：关注 P95 和 P99
4. **并发使用率**：current/max 比率
5. **告警触发数**：tb_polling_alert_history 新增数
