feat(queue): 增加非文本模型分布式准入队列
使用 PostgreSQL 统一同步与异步非文本任务的并发准入、持久化等待和 Worker 容量分配,并将生产 API 与独立 Worker 角色拆分。 补充策略管理、共享契约、OpenAPI、Kubernetes 双节点 Worker 清单及跨节点验收脚本;未默认启用任何生产 queue_size 策略。 已在原基线完成 Go、前端、迁移、Shell、Kustomize 与长任务容量验收;合入最新主干后将重新执行发布门禁。
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
package runner
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sync/atomic"
|
||||
)
|
||||
|
||||
type submissionCancellationGate struct {
|
||||
submitted atomic.Bool
|
||||
}
|
||||
|
||||
type submissionCancellationGateKey struct{}
|
||||
|
||||
func NewRequestExecutionContext(requestContext context.Context, serverContext context.Context) (context.Context, context.CancelFunc) {
|
||||
base, cancel := context.WithCancel(context.WithoutCancel(requestContext))
|
||||
gate := &submissionCancellationGate{}
|
||||
ctx := context.WithValue(base, submissionCancellationGateKey{}, gate)
|
||||
go func() {
|
||||
select {
|
||||
case <-serverContext.Done():
|
||||
cancel()
|
||||
case <-requestContext.Done():
|
||||
if !gate.submitted.Load() {
|
||||
cancel()
|
||||
return
|
||||
}
|
||||
select {
|
||||
case <-serverContext.Done():
|
||||
cancel()
|
||||
case <-base.Done():
|
||||
}
|
||||
case <-base.Done():
|
||||
}
|
||||
}()
|
||||
return ctx, cancel
|
||||
}
|
||||
|
||||
func markUpstreamSubmissionStarted(ctx context.Context) {
|
||||
if gate, ok := ctx.Value(submissionCancellationGateKey{}).(*submissionCancellationGate); ok {
|
||||
gate.submitted.Store(true)
|
||||
}
|
||||
}
|
||||
|
||||
func requestCancelledBeforeSubmission(ctx context.Context) bool {
|
||||
gate, ok := ctx.Value(submissionCancellationGateKey{}).(*submissionCancellationGate)
|
||||
return ok && ctx.Err() != nil && !gate.submitted.Load()
|
||||
}
|
||||
Reference in New Issue
Block a user