123 lines
3.9 KiB
Go
123 lines
3.9 KiB
Go
|
|
package asynq
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
|
|||
|
|
"github.com/hibiken/asynq"
|
|||
|
|
"go.uber.org/zap"
|
|||
|
|
|
|||
|
|
"tyapi-server/internal/application/api"
|
|||
|
|
"tyapi-server/internal/application/article"
|
|||
|
|
finance_services "tyapi-server/internal/domains/finance/services"
|
|||
|
|
product_services "tyapi-server/internal/domains/product/services"
|
|||
|
|
"tyapi-server/internal/infrastructure/task/handlers"
|
|||
|
|
"tyapi-server/internal/infrastructure/task/repositories"
|
|||
|
|
"tyapi-server/internal/infrastructure/task/types"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// AsynqWorker Asynq Worker实现
|
|||
|
|
type AsynqWorker struct {
|
|||
|
|
server *asynq.Server
|
|||
|
|
mux *asynq.ServeMux
|
|||
|
|
logger *zap.Logger
|
|||
|
|
articleHandler *handlers.ArticleTaskHandler
|
|||
|
|
apiHandler *handlers.ApiTaskHandler
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// NewAsynqWorker 创建Asynq Worker
|
|||
|
|
func NewAsynqWorker(
|
|||
|
|
redisAddr string,
|
|||
|
|
logger *zap.Logger,
|
|||
|
|
articleApplicationService article.ArticleApplicationService,
|
|||
|
|
apiApplicationService api.ApiApplicationService,
|
|||
|
|
walletService finance_services.WalletAggregateService,
|
|||
|
|
subscriptionService *product_services.ProductSubscriptionService,
|
|||
|
|
asyncTaskRepo repositories.AsyncTaskRepository,
|
|||
|
|
) *AsynqWorker {
|
|||
|
|
server := asynq.NewServer(
|
|||
|
|
asynq.RedisClientOpt{Addr: redisAddr},
|
|||
|
|
asynq.Config{
|
|||
|
|
Concurrency: 6, // 降低总并发数
|
|||
|
|
Queues: map[string]int{
|
|||
|
|
"default": 2, // 2个goroutine
|
|||
|
|
"api": 3, // 3个goroutine (扣款任务)
|
|||
|
|
"article": 1, // 1个goroutine
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// 创建任务处理器
|
|||
|
|
articleHandler := handlers.NewArticleTaskHandler(logger, articleApplicationService, asyncTaskRepo)
|
|||
|
|
apiHandler := handlers.NewApiTaskHandler(logger, apiApplicationService, walletService, subscriptionService, asyncTaskRepo)
|
|||
|
|
|
|||
|
|
// 创建ServeMux
|
|||
|
|
mux := asynq.NewServeMux()
|
|||
|
|
|
|||
|
|
return &AsynqWorker{
|
|||
|
|
server: server,
|
|||
|
|
mux: mux,
|
|||
|
|
logger: logger,
|
|||
|
|
articleHandler: articleHandler,
|
|||
|
|
apiHandler: apiHandler,
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// RegisterHandler 注册任务处理器
|
|||
|
|
func (w *AsynqWorker) RegisterHandler(taskType types.TaskType, handler func(context.Context, *asynq.Task) error) {
|
|||
|
|
// 简化实现,避免API兼容性问题
|
|||
|
|
w.logger.Info("注册任务处理器", zap.String("task_type", string(taskType)))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Start 启动Worker
|
|||
|
|
func (w *AsynqWorker) Start() error {
|
|||
|
|
w.logger.Info("启动Asynq Worker")
|
|||
|
|
|
|||
|
|
// 注册所有任务处理器
|
|||
|
|
w.registerAllHandlers()
|
|||
|
|
|
|||
|
|
// 启动Worker服务器
|
|||
|
|
go func() {
|
|||
|
|
if err := w.server.Run(w.mux); err != nil {
|
|||
|
|
w.logger.Error("Worker运行失败", zap.Error(err))
|
|||
|
|
}
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
w.logger.Info("Asynq Worker启动成功")
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Stop 停止Worker
|
|||
|
|
func (w *AsynqWorker) Stop() {
|
|||
|
|
w.logger.Info("停止Asynq Worker")
|
|||
|
|
w.server.Stop()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Shutdown 优雅关闭Worker
|
|||
|
|
func (w *AsynqWorker) Shutdown() {
|
|||
|
|
w.logger.Info("优雅关闭Asynq Worker")
|
|||
|
|
w.server.Shutdown()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// registerAllHandlers 注册所有任务处理器
|
|||
|
|
func (w *AsynqWorker) registerAllHandlers() {
|
|||
|
|
// 注册文章任务处理器
|
|||
|
|
w.mux.HandleFunc(string(types.TaskTypeArticlePublish), w.articleHandler.HandleArticlePublish)
|
|||
|
|
w.mux.HandleFunc(string(types.TaskTypeArticleCancel), w.articleHandler.HandleArticleCancel)
|
|||
|
|
w.mux.HandleFunc(string(types.TaskTypeArticleModify), w.articleHandler.HandleArticleModify)
|
|||
|
|
|
|||
|
|
// 注册API任务处理器
|
|||
|
|
w.mux.HandleFunc(string(types.TaskTypeApiCall), w.apiHandler.HandleApiCall)
|
|||
|
|
w.mux.HandleFunc(string(types.TaskTypeApiLog), w.apiHandler.HandleApiLog)
|
|||
|
|
w.mux.HandleFunc(string(types.TaskTypeDeduction), w.apiHandler.HandleDeduction)
|
|||
|
|
w.mux.HandleFunc(string(types.TaskTypeCompensation), w.apiHandler.HandleCompensation)
|
|||
|
|
w.mux.HandleFunc(string(types.TaskTypeUsageStats), w.apiHandler.HandleUsageStats)
|
|||
|
|
|
|||
|
|
w.logger.Info("所有任务处理器注册完成",
|
|||
|
|
zap.String("article_publish", string(types.TaskTypeArticlePublish)),
|
|||
|
|
zap.String("article_cancel", string(types.TaskTypeArticleCancel)),
|
|||
|
|
zap.String("article_modify", string(types.TaskTypeArticleModify)),
|
|||
|
|
zap.String("api_call", string(types.TaskTypeApiCall)),
|
|||
|
|
zap.String("api_log", string(types.TaskTypeApiLog)),
|
|||
|
|
)
|
|||
|
|
}
|