feat: 添加分布式锁以防止多个任务同时执行

This commit is contained in:
TsMask
2025-10-11 15:53:32 +08:00
parent 8f7636bc2a
commit b971bd872a
21 changed files with 203 additions and 2 deletions

View File

@@ -10,6 +10,7 @@ import (
"time"
"be.ems/src/framework/cron"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/i18n"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/date"
@@ -48,6 +49,13 @@ func (s *BackupExportCDRProcessor) Execute(data any) (any, error) {
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:backup_export_cdr:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
var params struct {
DataType []string `json:"dataType"` // 类型支持 ims/smsc/smf/sgwc
FileType string `json:"fileType"` // 文件类型 csv/xlsx

View File

@@ -11,6 +11,7 @@ import (
"time"
"be.ems/src/framework/cron"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/date"
"be.ems/src/framework/utils/file"
@@ -48,6 +49,13 @@ func (s *BackupExportKPIProcessor) Execute(data any) (any, error) {
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:backup_export_kpi:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
var params struct {
DataType []string `json:"dataType"` // 类型支持 ims/amf/udm/smf/pcf/upf/mme/smsc
FileType string `json:"fileType"` // 文件类型 csv/xlsx

View File

@@ -9,6 +9,7 @@ import (
"time"
"be.ems/src/framework/cron"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/i18n"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/date"
@@ -43,6 +44,13 @@ func (s *BackupExportLogProcessor) Execute(data any) (any, error) {
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:backup_export_log:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
var params struct {
DataType []string `json:"dataType"` // 类型支持 operate/login
FileType string `json:"fileType"` // 文件类型 csv/xlsx

View File

@@ -10,6 +10,7 @@ import (
"be.ems/src/framework/cron"
"be.ems/src/framework/database/db"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/i18n"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/date"
@@ -54,6 +55,13 @@ func (s *BackupExportTableProcessor) Execute(data any) (any, error) {
return nil, err
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:backup_export_table:%d:%s", sysJob.JobId, params.TableName)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
var affected int64
var errMsg error
fileName := fmt.Sprintf("%s_export_%s.csv", strings.ToLower(params.TableName), time.Now().Format("20060102150405"))

View File

@@ -8,6 +8,7 @@ import (
"time"
"be.ems/src/framework/cron"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/file"
neDataModel "be.ems/src/modules/network_data/model"
@@ -47,6 +48,13 @@ func (s *BackupExportUDMProcessor) Execute(data any) (any, error) {
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:backup_export_udm:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
var params struct {
DataType []string `json:"dataType"` // 类型支持 auth/sub/voip/volte
FileType string `json:"fileType"` // 文件类型 csv/txt

View File

@@ -11,6 +11,7 @@ import (
"time"
"be.ems/src/framework/cron"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
)
@@ -38,6 +39,13 @@ func (s *BackupRemoveFileProcessor) Execute(data any) (any, error) {
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:backup_remove_file:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
// 读取参数值
var params []struct {
BackupPath string `json:"backupPath"` // 备份路径 /usr/local/omc/backup/{backupPath}

View File

@@ -7,6 +7,7 @@ import (
"be.ems/src/framework/cron"
"be.ems/src/framework/database/db"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
)
@@ -29,6 +30,13 @@ func (s *DeleteAlarmRecordProcessor) Execute(data any) (any, error) {
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:delete_alarm_record:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
// 读取参数值
var params struct {
StoreDays int `json:"storeDays"` // store days

View File

@@ -1,4 +1,4 @@
package delete_CDR_record
package delete_cdr_record
import (
"encoding/json"
@@ -8,6 +8,7 @@ import (
"be.ems/src/framework/cron"
"be.ems/src/framework/database/db"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
)
@@ -30,6 +31,13 @@ func (s *DeleteCDRRecordProcessor) Execute(data any) (any, error) {
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:delete_cdr_record:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
// 读取参数值
var params struct {
StoreDays int `json:"storeDays"` // store days

View File

@@ -7,6 +7,7 @@ import (
"be.ems/src/framework/cron"
"be.ems/src/framework/database/db"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
)
@@ -51,6 +52,14 @@ func (s *DeleteDataRecordProcessor) Execute(data any) (any, error) {
if params.StoreDays < 0 {
return nil, fmt.Errorf("params storeDays less than 0 ")
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:delete_data_record:%d:%s", sysJob.JobId, params.TableName)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
// 指定表名
tx := db.DB("").Table(params.TableName)

View File

@@ -8,6 +8,7 @@ import (
"be.ems/src/framework/cron"
"be.ems/src/framework/database/db"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
)
@@ -30,6 +31,13 @@ func (s *DeleteKPIRecordProcessor) Execute(data any) (any, error) {
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:delete_kpi_record:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
// 读取参数值
var params struct {
StoreDays int `json:"storeDays"` // store days

View File

@@ -10,6 +10,7 @@ import (
"be.ems/src/framework/cron"
"be.ems/src/framework/database/db"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/date"
neModel "be.ems/src/modules/network_element/model"
@@ -37,6 +38,13 @@ func (s *DeleteNeConfigBackupProcessor) Execute(data any) (any, error) {
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:delete_ne_config_backup:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
// 读取参数值
var params struct {
StoreDays int `json:"storeDays"` // 保留天数

View File

@@ -1,4 +1,4 @@
package delete_UENB_record
package delete_uenb_record
import (
"encoding/json"
@@ -8,6 +8,7 @@ import (
"be.ems/src/framework/cron"
"be.ems/src/framework/database/db"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
)
@@ -30,6 +31,13 @@ func (s *DeleteUENBRecordProcessor) Execute(data any) (any, error) {
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:delete_uenb_record:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
// 读取参数值
var params struct {
StoreDays int `json:"storeDays"` // store days

View File

@@ -5,6 +5,7 @@ import (
"fmt"
"be.ems/src/framework/cron"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
monitorService "be.ems/src/modules/monitor/service"
)
@@ -31,6 +32,13 @@ func (s *MonitorSysResourceProcessor) Execute(data any) (any, error) {
sysJob := options.SysJob
logger.Infof("重复:%v 任务ID:%d 执行次数:%d", options.Repeat, sysJob.JobId, s.count)
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:monitor_sys_resource:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
// 读取参数值
var params struct {
Interval float64 `json:"interval"`

View File

@@ -9,6 +9,7 @@ import (
"be.ems/src/framework/constants"
"be.ems/src/framework/cron"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/parse"
neModel "be.ems/src/modules/network_element/model"
@@ -50,6 +51,13 @@ func (s *NeAlarmStateCheckProcessor) Execute(data any) (any, error) {
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:ne_alarm_state_check:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
// 读取参数值
var params alarmParams
err := json.Unmarshal([]byte(sysJob.TargetParams), &params)

View File

@@ -14,6 +14,7 @@ import (
"be.ems/src/framework/constants"
"be.ems/src/framework/cron"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/parse"
neDataModel "be.ems/src/modules/network_data/model"
@@ -71,6 +72,13 @@ func (s *NeAlarmStateCheckCMDProcessor) Execute(data any) (any, error) {
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:ne_alarm_state_check_cmd:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
// 读取参数值
var params alarmParams
err := json.Unmarshal([]byte(sysJob.TargetParams), &params)

View File

@@ -8,6 +8,7 @@ import (
"be.ems/src/framework/constants"
"be.ems/src/framework/cron"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/parse"
"github.com/tsmask/go-oam"
@@ -52,6 +53,13 @@ func (s *NeAlarmStateCheckLicenseProcessor) Execute(data any) (any, error) {
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:ne_alarm_state_check_license:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
// 读取参数值
var params alarmParams
err := json.Unmarshal([]byte(sysJob.TargetParams), &params)

View File

@@ -5,6 +5,7 @@ import (
"path/filepath"
"be.ems/src/framework/cron"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
neDataService "be.ems/src/modules/network_data/service"
neModel "be.ems/src/modules/network_element/model"
@@ -36,6 +37,13 @@ func (s *NeConfigBackupProcessor) Execute(data any) (any, error) {
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:ne_config_backup:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
neList := s.neInfoService.Find(neModel.NeInfo{}, false, false)
for _, neInfo := range neList {
neTypeAndId := fmt.Sprintf("%s_%s", neInfo.NeType, neInfo.NeId)

View File

@@ -4,6 +4,7 @@ import (
"fmt"
"be.ems/src/framework/cron"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
neDataService "be.ems/src/modules/network_data/service"
neModel "be.ems/src/modules/network_element/model"
@@ -35,6 +36,13 @@ func (s *NeDataUDM) Execute(data any) (any, error) {
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:ne_data_udm:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
neList := s.neInfoService.Find(neModel.NeInfo{NeType: "UDM"}, false, false)
for _, neInfo := range neList {
result[fmt.Sprintf("AuthNumber_%s", neInfo.NeId)] = s.udmAuthService.ResetData(neInfo.NeId)