Files
collector/REFACTOR.md
2026-04-07 12:22:57 +08:00

3.5 KiB

重构说明

重构内容

本次重构将项目从原生SQL和time.Ticker改为使用更现代化的库:

1. 定时任务调度器

之前: 使用 time.Ticker

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

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

db, err := sql.Open("postgres", connStr)
_, err := s.db.Exec(query, params...)
tx, err := s.db.Begin()
stmt, err := tx.Prepare(query)

现在: 使用 GORM

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. 备份现有数据库(可选,但推荐)

    pg_dump -U user -d qmt_db > backup.sql
    
  2. 更新依赖

    go mod tidy
    
  3. 重新编译

    go build -o collector.exe cmd/main.go
    
  4. 运行新程序

    ./collector.exe
    

程序会自动检测并迁移数据库表结构。

性能对比

定时任务

  • time.Ticker: 简单场景足够,但功能有限
  • cron: 功能强大,支持复杂调度,性能相当

数据库操作

  • 原生SQL: 性能略高,但开发效率低
  • GORM: 开发效率高,批量插入性能优秀,适合本项目

对于本项目的数据采集场景,GORM的性能完全足够,且大大提升了开发效率和代码可维护性。

测试

所有单元测试已通过:

go test ./collector -v

编译成功:

go build -o collector.exe cmd/main.go

总结

本次重构在不改变功能的前提下,使用了更现代化、更易维护的技术栈:

  • 更灵活的定时任务调度
  • 更简洁的数据库操作
  • 自动表结构管理
  • 更好的代码可读性和可维护性
  • 保持向后兼容