sharding.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package job
  2. import (
  3. "context"
  4. "time"
  5. "github.com/go-nunu/nunu-layout-advanced/internal/service"
  6. "github.com/go-nunu/nunu-layout-advanced/pkg/log"
  7. )
  8. // ShardingJob 分表管理定时任务
  9. type ShardingJob struct {
  10. shardingService service.ShardingService
  11. logger *log.Logger
  12. }
  13. func NewShardingJob(
  14. shardingService service.ShardingService,
  15. logger *log.Logger,
  16. ) *ShardingJob {
  17. return &ShardingJob{
  18. shardingService: shardingService,
  19. logger: logger,
  20. }
  21. }
  22. // InitSharding 初始化分表(启动时执行一次)
  23. func (j *ShardingJob) InitSharding() {
  24. ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
  25. defer cancel()
  26. j.logger.Info("执行分表初始化任务...")
  27. err := j.shardingService.InitializeSharding(ctx)
  28. if err != nil {
  29. j.logger.Error("分表初始化失败: " + err.Error())
  30. } else {
  31. j.logger.Info("分表初始化完成")
  32. }
  33. }
  34. // CleanOldTables 清理过期分表(定时执行)
  35. func (j *ShardingJob) CleanOldTables() {
  36. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute)
  37. defer cancel()
  38. j.logger.Info("执行分表清理任务...")
  39. err := j.shardingService.CleanOldTables(ctx)
  40. if err != nil {
  41. j.logger.Error("分表清理失败: " + err.Error())
  42. } else {
  43. j.logger.Info("分表清理完成")
  44. }
  45. }
  46. // CheckNewPeriodTables 检查是否需要创建新周期的分表(每月第一天执行)
  47. func (j *ShardingJob) CheckNewPeriodTables() {
  48. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
  49. defer cancel()
  50. j.logger.Info("检查是否需要创建新周期分表...")
  51. // 检查是否是月初第一天
  52. now := time.Now()
  53. if now.Day() != 1 {
  54. j.logger.Info("不是月初第一天,跳过新周期分表检查")
  55. return
  56. }
  57. err := j.shardingService.InitializeSharding(ctx)
  58. if err != nil {
  59. j.logger.Error("新周期分表创建失败: " + err.Error())
  60. } else {
  61. j.logger.Info("新周期分表检查完成")
  62. }
  63. }