Files
collector/REFACTOR.md

171 lines
3.5 KiB
Markdown
Raw Normal View History

2026-04-07 12:22:57 +08:00
# 重构说明
## 重构内容
本次重构将项目从原生SQL和time.Ticker改为使用更现代化的库:
### 1. 定时任务调度器
**之前**: 使用 `time.Ticker`
```go
ticker := time.NewTicker(time.Duration(interval) * time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
runCollection(coll, store)
case <-quit:
return
}
}
```
**现在**: 使用 `github.com/robfig/cron/v3`
```go
c := cron.New(cron.WithSeconds())
cronSpec := fmt.Sprintf("@every %ds", interval)
_, err = c.AddFunc(cronSpec, func() {
runCollection(coll, store)
})
c.Start()
// ...
c.Stop()
```
**优势**:
- 支持标准的cron表达式,更灵活
- 可以配置多个不同频率的任务
- 更好的任务管理和控制
- 支持秒级精度
### 2. 数据库ORM
**之前**: 使用原生 `database/sql` + `github.com/lib/pq`
```go
db, err := sql.Open("postgres", connStr)
_, err := s.db.Exec(query, params...)
tx, err := s.db.Begin()
stmt, err := tx.Prepare(query)
```
**现在**: 使用 `GORM`
```go
db, err := gorm.Open(postgres.Open(connStr), &gorm.Config{})
tx.Create(&model)
tx.CreateInBatches(models, 100)
db.AutoMigrate(&models.Model{})
```
**优势**:
- 自动数据库表结构迁移
- 面向对象的操作方式
- 批量插入优化
- 自动管理连接池
- 更好的类型安全
- 支持软删除
- 链式调用,代码更简洁
## 主要变化
### 文件变化
1. **models/models.go**
- 添加GORM标签
- 添加DeletedAt字段支持软删除
- ID类型从int改为uint
2. **storage/storage.go**
- 完全重写,使用GORM
- 添加AutoMigrate方法
- 简化事务处理
- 使用CreateInBatches批量插入
3. **cmd/main.go**
- 使用cron替代time.Ticker
- 添加AutoMigrate调用
- 更优雅的启动和停止流程
4. **go.mod**
- 移除: github.com/lib/pq (由GORM驱动替代)
- 新增: github.com/robfig/cron/v3
- 新增: gorm.io/gorm
- 新增: gorm.io/driver/postgres
### 数据库变化
**之前**: 需要手动执行 `scripts/schema.sql` 创建表
**现在**: 程序启动时自动创建和迁移表结构
## 兼容性说明
### API兼容
- 外部接口保持不变
- 环境变量配置保持不变
- 数据结构保持不变
### 数据库兼容
- 表结构与原设计完全一致
- 字段类型和索引保持一致
- 可以直接在原有数据库上运行(会保留已有数据)
## 升级步骤
1. 备份现有数据库(可选,但推荐)
```bash
pg_dump -U user -d qmt_db > backup.sql
```
2. 更新依赖
```bash
go mod tidy
```
3. 重新编译
```bash
go build -o collector.exe cmd/main.go
```
4. 运行新程序
```bash
./collector.exe
```
程序会自动检测并迁移数据库表结构。
## 性能对比
### 定时任务
- **time.Ticker**: 简单场景足够,但功能有限
- **cron**: 功能强大,支持复杂调度,性能相当
### 数据库操作
- **原生SQL**: 性能略高,但开发效率低
- **GORM**: 开发效率高,批量插入性能优秀,适合本项目
对于本项目的数据采集场景,GORM的性能完全足够,且大大提升了开发效率和代码可维护性。
## 测试
所有单元测试已通过:
```bash
go test ./collector -v
```
编译成功:
```bash
go build -o collector.exe cmd/main.go
```
## 总结
本次重构在不改变功能的前提下,使用了更现代化、更易维护的技术栈:
- ✅ 更灵活的定时任务调度
- ✅ 更简洁的数据库操作
- ✅ 自动表结构管理
- ✅ 更好的代码可读性和可维护性
- ✅ 保持向后兼容