fix(worker): 将 Gemini 同步请求交由异步队列执行
将非流式 Gemini generateContent 改为 River Worker 执行,API 通过批量状态查询等待完成,避免高并发同步请求耗尽 API 数据库连接池。\n\n生成图片在持久化时保存带哈希的资产引用,响应恢复时下载并校验后重建 Base64,数据库不保存媒体原文。请求体物化增加前置内存门禁,并扩展双 API/Worker PostgreSQL 压力测试。\n\n验证:go test ./... -count=1;go vet ./...;pnpm openapi;迁移安全检查;64 与 256 请求双角色异步 Gemini 压力测试。
This commit is contained in:
@@ -2195,6 +2195,30 @@ SELECT `+gatewayTaskColumns+`
|
||||
return task, nil
|
||||
}
|
||||
|
||||
func (s *Store) ListTaskStatuses(ctx context.Context, taskIDs []string) (map[string]string, error) {
|
||||
statuses := make(map[string]string, len(taskIDs))
|
||||
if len(taskIDs) == 0 {
|
||||
return statuses, nil
|
||||
}
|
||||
rows, err := s.pool.Query(ctx, `
|
||||
SELECT id::text, status
|
||||
FROM gateway_tasks
|
||||
WHERE id = ANY($1::uuid[])`, taskIDs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
var taskID string
|
||||
var status string
|
||||
if err := rows.Scan(&taskID, &status); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
statuses[taskID] = status
|
||||
}
|
||||
return statuses, rows.Err()
|
||||
}
|
||||
|
||||
type taskScanner interface {
|
||||
Scan(dest ...any) error
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user