Kaynağa Gözat

feat(sharding): 新增按日分表功能并添加阈值配置

- 新增 DailyShardingStrategy 类实现按日分表策略- 在 NewShardingManager 函数中添加阈值配置参数
- 阈值配置包括启用状态和最大行数限制
fusu 10 saat önce
ebeveyn
işleme
a4d2214fdb
2 değiştirilmiş dosya ile 50 ekleme ve 2 silme
  1. 9 2
      internal/repository/repository.go
  2. 41 0
      pkg/sharding/strategy.go

+ 9 - 2
internal/repository/repository.go

@@ -413,8 +413,15 @@ m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
 	return e
 }
 
-// new creates a ShardingManager for dependency injection
+// NewShardingManager creates a ShardingManager with threshold support for dependency injection
 func NewShardingManager(logger *log.Logger) *sharding.ShardingManager {
 	strategy := sharding.NewMonthlyShardingStrategy()
-	return sharding.NewShardingManager(strategy, logger)
+	
+	// 配置阈值参数
+	thresholdConfig := &sharding.ThresholdConfig{
+		Enabled: true,
+		MaxRows: 5000000, // waf_log表500万条阈值
+	}
+	
+	return sharding.NewShardingManagerWithThreshold(strategy, logger, thresholdConfig)
 }

+ 41 - 0
pkg/sharding/strategy.go

@@ -61,4 +61,45 @@ func (s *MonthlyShardingStrategy) IsNewPeriod(lastTableTime, currentTime time.Ti
 	currentMonth := time.Date(currentTime.Year(), currentTime.Month(), 1, 0, 0, 0, 0, currentTime.Location())
 	
 	return currentMonth.After(lastMonth)
+}
+
+// DailyShardingStrategy 按日分表策略 - 每天分表
+type DailyShardingStrategy struct{}
+
+func NewDailyShardingStrategy() ShardingStrategy {
+	return &DailyShardingStrategy{}
+}
+
+func (s *DailyShardingStrategy) GetTableName(baseTableName string, t time.Time) string {
+	return fmt.Sprintf("%s_%d%02d%02d", baseTableName, t.Year(), t.Month(), t.Day())
+}
+
+func (s *DailyShardingStrategy) GetCurrentTableName(baseTableName string) string {
+	return s.GetTableName(baseTableName, time.Now())
+}
+
+func (s *DailyShardingStrategy) GetTableNamesByRange(baseTableName string, start, end time.Time) []string {
+	var tableNames []string
+	current := time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, start.Location())
+	endDay := time.Date(end.Year(), end.Month(), end.Day(), 0, 0, 0, 0, end.Location())
+
+	for !current.After(endDay) {
+		tableNames = append(tableNames, s.GetTableName(baseTableName, current))
+		current = current.AddDate(0, 0, 1) // 每次增加一天
+	}
+
+	return tableNames
+}
+
+func (s *DailyShardingStrategy) GetNextTableName(currentTableName string) string {
+	// 日度分表的序号表名
+	return fmt.Sprintf("%s_01", currentTableName)
+}
+
+func (s *DailyShardingStrategy) IsNewPeriod(lastTableTime, currentTime time.Time) bool {
+	// 检查是否到了新的一天
+	lastDay := time.Date(lastTableTime.Year(), lastTableTime.Month(), lastTableTime.Day(), 0, 0, 0, 0, lastTableTime.Location())
+	currentDay := time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(), 0, 0, 0, 0, currentTime.Location())
+	
+	return currentDay.After(lastDay)
 }