feat: 抓取任务队列 + 媒体机直传 + 向量回填
crawl(品牌抓取任务队列) - /admin/internal/crawl/tasks 领取 / :id/result 回报,spider 可常驻拉任务 - 后台品牌列表支持「加入抓取队列」,队列页可看状态与重试 - 租约超时的 running 自动回收为 queued,避免 worker 崩溃后任务卡死 media(媒体机直传) - ingest 载荷新增 main_key/detail_keys/main_size/detail_sizes: 有 key 就直接落库,跳过下载与上传;与 URL 形态可逐图混用 - 细节图按 Details/DetailKeys 两者较长者遍历(只给 key 时不再丢图) - 媒体机上传的 key 不进失败回滚清单(内容寻址、可能与他人共享) - /admin/internal/upload-url 签发 S4 PUT 预签名(spider 不持有 AK/SK) embeddings(向量回填) - GET /admin/internal/embeddings/pending 派发缺向量的图(含可直接下载的 url) - POST /admin/internal/embeddings 回写向量并重算近邻;失败项计入 image_embedding_failures,连续失败到上限后退出队列(坏图不占位) - 近邻重算改为异步串行:同步会让 100 张的批次 POST 超时(实测 >60s) - 新增 key 分支单测:混用 key/url、细节图只给 key、字节数、回滚清单、向量占位
This commit is contained in:
@ -13,6 +13,8 @@ import (
|
||||
"os"
|
||||
"os/signal"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
@ -217,6 +219,12 @@ func main() {
|
||||
// 后台页面因此只需读一次小查询(原先是页面内对每张图实时检索,一个 116 张图的图集要 5 秒)。
|
||||
ingestSvc.SetSimilar(similarSvc)
|
||||
backstageHandler := handler.NewBackstageHandler(authSvc, brandSvc, articleSvc, snapSvc, reviewSvc, ingestSvc, adminRepo, translateSvc, similarSvc)
|
||||
// 品牌抓取任务(crawl_tasks):后台决定爬哪些品牌,spider 服务(可跨机)领取执行。
|
||||
backstageHandler.SetCrawl(repository.NewCrawlRepository(db))
|
||||
// 向量回填接口的仓储(媒体机直传后,向量只能由外部 worker 回传)。
|
||||
backstageHandler.SetEmbeddingRepo(embedRepo)
|
||||
// S4 上传器:给媒体机签发直传 URL(密钥只留在后端)。
|
||||
backstageHandler.SetUploader(s4Up)
|
||||
// 手工建稿:复用入库仓储的写入方法(Create*WithImages,事务内完成)与同一套存储上传
|
||||
// (imgUp = S4/本地主上传器,sha1 内容寻址),保证与爬虫入库产出的 key / 行结构一致。
|
||||
backstageHandler.SetManual(service.NewManualArticleService(ingestRepo, brandRepo, imgUp, localUp, visionClient, embedRepo))
|
||||
@ -275,8 +283,18 @@ func main() {
|
||||
// 7.6 启动爬虫入库 worker(异步处理 ingest_jobs 队列)。
|
||||
// 用独立可取消 ctx,优雅关闭时随主流程一起退出。
|
||||
workerCtx, workerCancel := context.WithCancel(context.Background())
|
||||
go ingestSvc.Run(workerCtx, 2, 3*time.Second)
|
||||
slog.Info("入库 worker 已启动", "queue", "ingest_jobs")
|
||||
// 并发数可配:批量重爬时单进程 2 个 worker 是吞吐瓶颈(配合 INGEST_IMAGE_CONCURRENCY 决定总并发)。
|
||||
// 默认仍是 2,行为与之前一致;1~16 之外的值忽略并回落默认。
|
||||
ingestWorkers := 2
|
||||
if v := strings.TrimSpace(os.Getenv("INGEST_WORKERS")); v != "" {
|
||||
if n, err := strconv.Atoi(v); err == nil && n >= 1 && n <= 16 {
|
||||
ingestWorkers = n
|
||||
} else {
|
||||
slog.Warn("INGEST_WORKERS 非法(应为 1~16 的整数),回退默认 2", "value", v)
|
||||
}
|
||||
}
|
||||
go ingestSvc.Run(workerCtx, ingestWorkers, 3*time.Second)
|
||||
slog.Info("入库 worker 已启动", "queue", "ingest_jobs", "workers", ingestWorkers)
|
||||
srvBackstage := &http.Server{
|
||||
Addr: ":" + cfg.Server.BackstagePort,
|
||||
Handler: backstageEngine,
|
||||
|
||||
Reference in New Issue
Block a user