使用 PostgreSQL 统一同步与异步非文本任务的并发准入、持久化等待和 Worker 容量分配,并将生产 API 与独立 Worker 角色拆分。 补充策略管理、共享契约、OpenAPI、Kubernetes 双节点 Worker 清单及跨节点验收脚本;未默认启用任何生产 queue_size 策略。 已在原基线完成 Go、前端、迁移、Shell、Kustomize 与长任务容量验收;合入最新主干后将重新执行发布门禁。
48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
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()
|
|
}
|