dddc1cd081
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 36s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 36s
AI Code Review / AI Code Review (pull_request) Successful in 49s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 51s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 1m45s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m50s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m25s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m50s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 5m20s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 7m24s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 7s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 15s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 5m12s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 10m21s
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 12m29s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 12m47s
65 lines
2.4 KiB
Bash
Executable File
65 lines
2.4 KiB
Bash
Executable File
#!/bin/bash
|
||
# Worker 启动脚本 — #1714 队列隔离
|
||
#
|
||
# 部署约束:worker 容器单实例(replicas=1),容器内启动两个 celery 进程:
|
||
# 1. generation-worker:独占消费 generation 队列(用户视频生成,高优先级),
|
||
# 内嵌 celery beat(-B),定时清理任务只在一个进程里跑,避免重复执行;
|
||
# 2. transcode-worker:消费 transcode + celery 默认队列(素材转码/分类/查重/
|
||
# 配音/下载等后台任务)。
|
||
# 转码队列积压时,generation 队列仍有独立 worker 立即领取视频生成任务。
|
||
#
|
||
# 环境变量:
|
||
# WORKER_CONCURRENCY 总并发槽参考(默认 4);生成 worker 并发默认 2,
|
||
# 可用 GENERATION_CONCURRENCY 覆盖
|
||
# GENERATION_CONCURRENCY generation worker 并发(默认 2)
|
||
# TRANSCODE_CONCURRENCY transcode worker 并发(默认 = WORKER_CONCURRENCY - 2,最小 1)
|
||
# WORKER_MAX_TASKS_PER_CHILD 每个子进程最大任务数(默认 100)
|
||
|
||
set -e
|
||
|
||
CONCURRENCY="${WORKER_CONCURRENCY:-4}"
|
||
MAX_TASKS="${WORKER_MAX_TASKS_PER_CHILD:-100}"
|
||
|
||
GEN_CONCURRENCY="${GENERATION_CONCURRENCY:-2}"
|
||
if [ -z "$TRANSCODE_CONCURRENCY" ]; then
|
||
TRANS_CONCURRENCY=$((CONCURRENCY - GEN_CONCURRENCY))
|
||
if [ "$TRANS_CONCURRENCY" -lt 1 ]; then
|
||
TRANS_CONCURRENCY=1
|
||
fi
|
||
else
|
||
TRANS_CONCURRENCY="$TRANSCODE_CONCURRENCY"
|
||
fi
|
||
|
||
echo "Starting generation worker (queue=generation, concurrency=$GEN_CONCURRENCY, beat embedded)"
|
||
celery \
|
||
-A worker_app.celery_app \
|
||
worker \
|
||
--loglevel=info \
|
||
"-B" \
|
||
-s /tmp/celerybeat-schedule \
|
||
-Q generation \
|
||
"--concurrency=${GEN_CONCURRENCY}" \
|
||
"--max-tasks-per-child=${MAX_TASKS}" \
|
||
-n generation@%h &
|
||
GEN_PID=$!
|
||
|
||
echo "Starting transcode worker (queues=transcode,celery, concurrency=$TRANS_CONCURRENCY)"
|
||
celery \
|
||
-A worker_app.celery_app \
|
||
worker \
|
||
--loglevel=info \
|
||
-Q transcode,celery \
|
||
"--concurrency=${TRANS_CONCURRENCY}" \
|
||
"--max-tasks-per-child=${MAX_TASKS}" \
|
||
-n transcode@%h &
|
||
TRANS_PID=$!
|
||
|
||
# 任一进程退出则终止另一个,让容器整体重启(restart: unless-stopped)
|
||
trap 'echo "Shutting down workers..."; kill -TERM $GEN_PID $TRANS_PID 2>/dev/null || true' TERM INT
|
||
|
||
wait -n $GEN_PID $TRANS_PID
|
||
EXIT_CODE=$?
|
||
echo "One worker exited (code=$EXIT_CODE), stopping the other..."
|
||
kill -TERM $GEN_PID $TRANS_PID 2>/dev/null || true
|
||
exit $EXIT_CODE
|