160 lines
4.8 KiB
Go
160 lines
4.8 KiB
Go
package main
|
||
|
||
// 主程序包,负责初始化配置、日志、数据库连接、分布式锁、事件执行器、扫描器服务器和定时任务。
|
||
import (
|
||
"fmt"
|
||
"os"
|
||
"sync"
|
||
|
||
"gitlink.org.cn/cloudream/common/pkgs/logger"
|
||
stgglb "gitlink.org.cn/cloudream/storage/common/globals"
|
||
"gitlink.org.cn/cloudream/storage/common/pkgs/db"
|
||
"gitlink.org.cn/cloudream/storage/common/pkgs/distlock"
|
||
scmq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/scanner"
|
||
"gitlink.org.cn/cloudream/storage/scanner/internal/config"
|
||
"gitlink.org.cn/cloudream/storage/scanner/internal/event"
|
||
"gitlink.org.cn/cloudream/storage/scanner/internal/mq"
|
||
"gitlink.org.cn/cloudream/storage/scanner/internal/tickevent"
|
||
)
|
||
|
||
func main() {
|
||
// 初始化配置
|
||
err := config.Init()
|
||
if err != nil {
|
||
fmt.Printf("init config failed, err: %s", err.Error())
|
||
os.Exit(1)
|
||
}
|
||
|
||
// 初始化日志
|
||
err = logger.Init(&config.Cfg().Logger)
|
||
if err != nil {
|
||
fmt.Printf("init logger failed, err: %s", err.Error())
|
||
os.Exit(1)
|
||
}
|
||
|
||
// 初始化数据库连接
|
||
db, err := db.NewDB(&config.Cfg().DB)
|
||
if err != nil {
|
||
logger.Fatalf("new db failed, err: %s", err.Error())
|
||
}
|
||
|
||
// 初始化消息队列连接池
|
||
stgglb.InitMQPool(&config.Cfg().RabbitMQ)
|
||
|
||
// 同步等待组,用于等待所有Go协程完成
|
||
wg := sync.WaitGroup{}
|
||
wg.Add(3)
|
||
|
||
// 初始化分布式锁服务
|
||
distlockSvc, err := distlock.NewService(&config.Cfg().DistLock)
|
||
if err != nil {
|
||
logger.Warnf("new distlock service failed, err: %s", err.Error())
|
||
os.Exit(1)
|
||
}
|
||
go serveDistLock(distlockSvc, &wg)
|
||
|
||
// 初始化事件执行器,并启动服务
|
||
eventExecutor := event.NewExecutor(db, distlockSvc)
|
||
go serveEventExecutor(&eventExecutor, &wg)
|
||
|
||
// 初始化扫描器服务器,并启动服务
|
||
agtSvr, err := scmq.NewServer(mq.NewService(&eventExecutor), &config.Cfg().RabbitMQ)
|
||
if err != nil {
|
||
logger.Fatalf("new agent server failed, err: %s", err.Error())
|
||
}
|
||
agtSvr.OnError(func(err error) {
|
||
logger.Warnf("agent server err: %s", err.Error())
|
||
})
|
||
|
||
go serveScannerServer(agtSvr, &wg)
|
||
|
||
// 初始化并启动定时任务
|
||
tickExecutor := tickevent.NewExecutor(tickevent.ExecuteArgs{
|
||
EventExecutor: &eventExecutor,
|
||
DB: db,
|
||
})
|
||
startTickEvent(&tickExecutor)
|
||
|
||
// 等待所有服务完成
|
||
wg.Wait()
|
||
}
|
||
|
||
// serveEventExecutor 启动事件执行器服务
|
||
// executor: 事件执行器实例
|
||
// wg: 同步等待组
|
||
func serveEventExecutor(executor *event.Executor, wg *sync.WaitGroup) {
|
||
logger.Info("start serving event executor")
|
||
|
||
err := executor.Execute()
|
||
|
||
if err != nil {
|
||
logger.Errorf("event executor stopped with error: %s", err.Error())
|
||
}
|
||
|
||
logger.Info("event executor stopped")
|
||
|
||
wg.Done()
|
||
}
|
||
|
||
// serveScannerServer 启动扫描器服务器服务
|
||
// server: 扫描器服务器实例
|
||
// wg: 同步等待组
|
||
func serveScannerServer(server *scmq.Server, wg *sync.WaitGroup) {
|
||
logger.Info("start serving scanner server")
|
||
|
||
err := server.Serve()
|
||
|
||
if err != nil {
|
||
logger.Errorf("scanner server stopped with error: %s", err.Error())
|
||
}
|
||
|
||
logger.Info("scanner server stopped")
|
||
|
||
wg.Done()
|
||
}
|
||
|
||
// serveDistLock 启动分布式锁服务
|
||
// svc: 分布式锁服务实例
|
||
// wg: 同步等待组
|
||
func serveDistLock(svc *distlock.Service, wg *sync.WaitGroup) {
|
||
logger.Info("start serving distlock")
|
||
|
||
err := svc.Serve()
|
||
|
||
if err != nil {
|
||
logger.Errorf("distlock stopped with error: %s", err.Error())
|
||
}
|
||
|
||
logger.Info("distlock stopped")
|
||
|
||
wg.Done()
|
||
}
|
||
|
||
// startTickEvent 启动定时任务事件。
|
||
// 参数 tickExecutor 为 ticket 事件执行器的指针,用于启动各种定时任务。
|
||
func startTickEvent(tickExecutor *tickevent.Executor) {
|
||
// 考虑增加配置文件来配置这些任务的间隔时间
|
||
|
||
interval := 5 * 60 * 1000 // 定义默认的任务执行间隔时间
|
||
|
||
// 启动所有 Agent 检查缓存的定时任务
|
||
tickExecutor.Start(tickevent.NewBatchAllAgentCheckCache(), interval, tickevent.StartOption{RandomStartDelayMs: 60 * 1000})
|
||
|
||
// 启动检查所有包的定时任务
|
||
tickExecutor.Start(tickevent.NewBatchCheckAllPackage(), interval, tickevent.StartOption{RandomStartDelayMs: 60 * 1000})
|
||
|
||
// 注释掉的代码块,可能是未来可能使用的任务,目前未启用
|
||
|
||
// 启动检查所有存储的定时任务
|
||
tickExecutor.Start(tickevent.NewBatchCheckAllStorage(), interval, tickevent.StartOption{RandomStartDelayMs: 60 * 1000})
|
||
|
||
// 启动检查 Agent 状态的定时任务,此任务的执行间隔与上述任务不同
|
||
tickExecutor.Start(tickevent.NewCheckAgentState(), 5*60*1000, tickevent.StartOption{RandomStartDelayMs: 60 * 1000})
|
||
|
||
// 启动检查包冗余的定时任务
|
||
tickExecutor.Start(tickevent.NewBatchCheckPackageRedundancy(), interval, tickevent.StartOption{RandomStartDelayMs: 20 * 60 * 1000})
|
||
|
||
// 启动清理固定项目的定时任务
|
||
tickExecutor.Start(tickevent.NewBatchCleanPinned(), interval, tickevent.StartOption{RandomStartDelayMs: 20 * 60 * 1000})
|
||
}
|