feat: 添加媒体资源处理的异步任务及相关逻辑

This commit is contained in:
2025-12-23 12:04:30 +08:00
parent 7c2b937352
commit 1dba706022
8 changed files with 317 additions and 13 deletions

View File

@@ -0,0 +1,38 @@
package args
import (
"quyun/v2/providers/job"
. "github.com/riverqueue/river"
"go.ipao.vip/atom/contracts"
)
var _ contracts.JobArgs = MediaAssetProcessJob{}
// MediaAssetProcessJob 表示“媒体资源处理”的一次性异步任务。
//
// 设计说明:
// - 该任务用于将 media_assets 从 processing 推进到 ready/failed由 worker 执行核心处理逻辑)。
// - 幂等由 River Unique + 业务侧 DB 状态机共同保证(重复入队会被跳过或无副作用)。
type MediaAssetProcessJob struct {
// TenantID 租户ID用于多租户隔离与唯一性维度
TenantID int64 `json:"tenant_id" river:"unique"`
// AssetID 媒体资源ID用于唯一性维度
AssetID int64 `json:"asset_id" river:"unique"`
}
func (MediaAssetProcessJob) Kind() string { return "media_asset_process" }
func (a MediaAssetProcessJob) UniqueID() string { return a.Kind() }
func (MediaAssetProcessJob) InsertOpts() InsertOpts {
return InsertOpts{
Queue: job.QueueDefault,
Priority: job.PriorityDefault,
// 失败可重试;由 worker 判断不可重试的场景并 JobCancel。
MaxAttempts: 10,
UniqueOpts: UniqueOpts{
ByArgs: true,
},
}
}