async task framework

This commit is contained in:
ryan
2026-06-07 23:16:46 +08:00
parent 70a13dc107
commit 589ae08318
32 changed files with 3509 additions and 182 deletions
+4 -56
View File
@@ -18,67 +18,15 @@ package worker
import (
"context"
"time"
"github.com/linux-do/credit/internal/logger"
"go.opentelemetry.io/otel/trace"
"github.com/hibiken/asynq"
"github.com/linux-do/credit/internal/otel_trace"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
)
// taskLoggingMiddleware 记录任务日志中间件
// taskLoggingMiddleware 任务处理中间件
// 注意:OTel Span 创建、日志记录、TaskExecution 状态管理
// 已由 task.ProcessTask 统一处理,此中间件保留用于未来扩展(如限流、监控等)
func taskLoggingMiddleware(h asynq.Handler) asynq.Handler {
return asynq.HandlerFunc(func(ctx context.Context, t *asynq.Task) error {
// 初始化 Trace
ctx, span := otel_trace.Start(ctx, "TaskProcess_"+t.Type(), trace.WithSpanKind(trace.SpanKindConsumer))
defer span.End()
// 添加任务信息到 Span
span.SetAttributes(
attribute.String("task.type", t.Type()),
attribute.Int("task.payload_size", len(t.Payload())),
attribute.String("task.id", t.ResultWriter().TaskID()),
)
// 开始计时
start := time.Now()
// 处理任务
err := h.ProcessTask(ctx, t)
// 计算耗时
latency := time.Since(start)
if err != nil {
// 处理出错,记录错误日志
logger.ErrorF(
ctx,
"[TaskMiddleware] 任务处理失败 Type: %s\nStartTime: %s\nLatency: %d ms\nError: %v",
t.Type(),
start.Format(time.RFC3339),
latency.Milliseconds(),
err,
)
// 设置 Span 错误状态
span.SetStatus(codes.Error, err.Error())
span.RecordError(err)
return err
}
// 处理成功,记录成功日志
logger.InfoF(
ctx,
"[TaskMiddleware] 任务处理完成 Type: %s\nStartTime: %s\nEndTime: %s\nLatency: %d ms",
t.Type(),
start.Format(time.RFC3339),
time.Now().Format(time.RFC3339),
latency.Milliseconds(),
)
return nil
return h.ProcessTask(ctx, t)
})
}
+11 -3
View File
@@ -1,5 +1,5 @@
/*
Copyright 2025 linux.do
Copyright 2025-2026 linux.do
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -25,6 +25,11 @@ import (
"github.com/linux-do/credit/internal/task"
)
func init() {
// 注册所有任务处理器
task.RegisterHandler(task.CleanupUnusedUploadsTask, &upload.CleanupUnusedUploadsHandler{})
}
// StartWorker 启动任务处理服务器
func StartWorker() error {
asynqServer := asynq.NewServer(
@@ -37,10 +42,13 @@ func StartWorker() error {
},
)
// 注册任务处理器
// 注册 Asynq 任务路由
mux := asynq.NewServeMux()
mux.Use(taskLoggingMiddleware)
mux.HandleFunc(task.CleanupUnusedUploadsTask, upload.HandleCleanupUnusedUploads)
// 统一使用 task.ProcessTask 处理所有任务类型
// 框架内部自动分发到对应的 TaskHandler 实现
mux.HandleFunc(task.CleanupUnusedUploadsTask, task.ProcessTask)
// 启动服务器
return asynqServer.Run(mux)