feat: 添加过载保护、背压和熔断机制
CI / lint (push) Has been cancelled
CI / test (push) Has been cancelled
CI / build (push) Has been cancelled
CI / security-scan (push) Has been cancelled

This commit is contained in:
freedakgmail
2026-08-03 08:12:28 +08:00
parent 5bcfbdb88d
commit e7e98271d4
8 changed files with 704 additions and 36 deletions
+48 -17
View File
@@ -22,15 +22,18 @@ import (
// Server is the main HTTP server for the AI gateway.
type Server struct {
cfg *config.Config
logger *observability.Logger
metrics *observability.Metrics
HTTPSrv *http.Server
auth *auth.Authenticator
registry *adapter.Registry
modelMap *router.LogicalModelMapping
scheduler *scheduler.Scheduler
sessions *session.Store
cfg *config.Config
logger *observability.Logger
metrics *observability.Metrics
HTTPSrv *http.Server
auth *auth.Authenticator
registry *adapter.Registry
modelMap *router.LogicalModelMapping
scheduler *scheduler.Scheduler
sessions *session.Store
breaker *scheduler.CircuitBreaker
backpressure *scheduler.BackpressureManager
overload *router.OverloadResolver
}
// New creates a new Server instance with all components wired.
@@ -60,6 +63,9 @@ func New(cfg *config.Config, logger *observability.Logger) (*Server, error) {
// Initialize logical model mapping
modelMap := router.NewLogicalModelMapping(cfg)
// Initialize overload resolver
overloadResolver := router.NewOverloadResolver(&cfg.Routing, modelMap)
// Register adapters for each unique endpoint
registered := make(map[string]bool)
for _, mc := range cfg.Models {
@@ -78,18 +84,39 @@ func New(cfg *config.Config, logger *observability.Logger) (*Server, error) {
// Initialize scheduler
sched := scheduler.NewScheduler(&cfg.Scheduler, logger)
// Initialize circuit breaker
breaker := scheduler.NewCircuitBreaker(
cfg.CircuitBreaker.ErrorRateThreshold,
cfg.CircuitBreaker.MinRequests,
cfg.CircuitBreaker.WindowSeconds,
cfg.CircuitBreaker.OpenDurationSeconds,
cfg.CircuitBreaker.HalfOpenMaxRequests,
)
// Initialize backpressure manager
bp := scheduler.NewBackpressureManager(
cfg.Scheduler.MaxRunningTasks,
cfg.Scheduler.MaxQueuedTasks,
cfg.Backpressure.Level1Threshold,
cfg.Backpressure.Level2Threshold,
cfg.Backpressure.Level3Threshold,
)
// Initialize metrics
metrics := observability.NewMetrics()
s := &Server{
cfg: cfg,
logger: logger,
metrics: metrics,
auth: authenticator,
registry: registry,
modelMap: modelMap,
scheduler: sched,
sessions: sessionStore,
cfg: cfg,
logger: logger,
metrics: metrics,
auth: authenticator,
registry: registry,
modelMap: modelMap,
scheduler: sched,
sessions: sessionStore,
breaker: breaker,
backpressure: bp,
overload: overloadResolver,
}
mux := http.NewServeMux()
@@ -128,6 +155,10 @@ func (s *Server) registerRoutes(mux *http.ServeMux) {
// Session management
mux.HandleFunc("/v1/sessions", s.handleSessions)
mux.HandleFunc("/v1/sessions/", s.handleSessionByID)
// Task management
mux.HandleFunc("/v1/tasks", s.handleTasks)
mux.HandleFunc("/v1/tasks/", s.handleTaskByID)
}
// Authenticator returns the authenticator instance (for testing/management).