feat(queue): 增加非文本模型分布式准入队列
使用 PostgreSQL 统一同步与异步非文本任务的并发准入、持久化等待和 Worker 容量分配,并将生产 API 与独立 Worker 角色拆分。 补充策略管理、共享契约、OpenAPI、Kubernetes 双节点 Worker 清单及跨节点验收脚本;未默认启用任何生产 queue_size 策略。 已在原基线完成 Go、前端、迁移、Shell、Kustomize 与长任务容量验收;合入最新主干后将重新执行发布门禁。
This commit is contained in:
@@ -2,6 +2,66 @@ package store
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestNormalizeAndValidateQueuePolicy(t *testing.T) {
|
||||
t.Run("defaults maximum wait and preserves extensions", func(t *testing.T) {
|
||||
policy, err := NormalizeAndValidateRateLimitPolicy(map[string]any{
|
||||
"strategy": "strict",
|
||||
"rules": []any{map[string]any{
|
||||
"metric": "queue_size",
|
||||
"limit": 12,
|
||||
"source": "admin",
|
||||
}},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("NormalizeAndValidateRateLimitPolicy() error = %v", err)
|
||||
}
|
||||
queue, ok := QueueRuleFromPolicy(policy)
|
||||
if !ok || queue.Limit != 12 || queue.MaxWaitSeconds != 600 {
|
||||
t.Fatalf("queue rule = %+v, %v", queue, ok)
|
||||
}
|
||||
rules := policy["rules"].([]any)
|
||||
rule := rules[0].(map[string]any)
|
||||
if rule["source"] != "admin" {
|
||||
t.Fatalf("unknown extension was lost: %+v", rule)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("normalizes zero to a removed queue rule", func(t *testing.T) {
|
||||
policy, err := NormalizeAndValidateRateLimitPolicy(map[string]any{
|
||||
"rules": []any{
|
||||
map[string]any{"metric": "rpm", "limit": 30},
|
||||
map[string]any{"metric": "queue_size", "limit": 0},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("NormalizeAndValidateRateLimitPolicy() error = %v", err)
|
||||
}
|
||||
if _, ok := QueueRuleFromPolicy(policy); ok {
|
||||
t.Fatalf("zero queue rule remained enabled: %+v", policy)
|
||||
}
|
||||
rules := policy["rules"].([]any)
|
||||
if len(rules) != 1 {
|
||||
t.Fatalf("rules length = %d, want 1", len(rules))
|
||||
}
|
||||
})
|
||||
|
||||
for _, test := range []struct {
|
||||
name string
|
||||
policy map[string]any
|
||||
}{
|
||||
{name: "fractional queue", policy: map[string]any{"rules": []any{map[string]any{"metric": "queue_size", "limit": 1.5}}}},
|
||||
{name: "queue too large", policy: map[string]any{"rules": []any{map[string]any{"metric": "queue_size", "limit": 10001}}}},
|
||||
{name: "wait too large", policy: map[string]any{"rules": []any{map[string]any{"metric": "queue_size", "limit": 1, "maxWaitSeconds": 3601}}}},
|
||||
{name: "wait on rpm", policy: map[string]any{"rules": []any{map[string]any{"metric": "rpm", "limit": 1, "maxWaitSeconds": 60}}}},
|
||||
} {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
if _, err := NormalizeAndValidateRateLimitPolicy(test.policy); err == nil {
|
||||
t.Fatalf("invalid policy was accepted: %+v", test.policy)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestEffectiveRateLimitPolicyPrecedence(t *testing.T) {
|
||||
policy := func(limit float64) map[string]any {
|
||||
return map[string]any{"rules": []any{map[string]any{"metric": "concurrent", "limit": limit}}}
|
||||
|
||||
Reference in New Issue
Block a user