refactor(loadbalancer): implement sticky sessions and improve algorithm separation

- Refactor load balancer interface to separate server selection (ChooseServer) from request handling
- Add cookie-based sticky session support with configurable max-age and secure cookie handling
- Integrate idlewatcher requests with automatic sticky session assignment
- Improve algorithm implementations:
  * Replace fnv with xxhash3 for better performance in IP hash and server keys
  * Add proper bounds checking and error handling in all algorithms
  * Separate concerns between server selection and request processing
- Add Sticky and StickyMaxAge fields to LoadBalancerConfig
- Create dedicated sticky.go for session management utilities
This commit is contained in:
yusing
2025-11-07 15:24:57 +08:00
parent 910ef639a4
commit d33ff2192a
6 changed files with 166 additions and 37 deletions

View File

@@ -2,6 +2,7 @@ package types
import (
"net/http"
"time"
nettypes "github.com/yusing/godoxy/internal/net/types"
strutils "github.com/yusing/goutils/strings"
@@ -9,10 +10,12 @@ import (
type (
LoadBalancerConfig struct {
Link string `json:"link"`
Mode LoadBalancerMode `json:"mode"`
Weight int `json:"weight"`
Options map[string]any `json:"options,omitempty"`
Link string `json:"link"`
Mode LoadBalancerMode `json:"mode"`
Weight int `json:"weight"`
Sticky bool `json:"sticky"`
StickyMaxAge time.Duration `json:"sticky_max_age"`
Options map[string]any `json:"options,omitempty"`
} // @name LoadBalancerConfig
LoadBalancerMode string // @name LoadBalancerMode
LoadBalancerServer interface {
@@ -35,6 +38,8 @@ const (
LoadbalanceModeIPHash LoadBalancerMode = "iphash"
)
const StickyMaxAgeDefault = 1 * time.Hour
func (mode *LoadBalancerMode) ValidateUpdate() bool {
switch strutils.ToLowerNoSnake(string(*mode)) {
case "":