High Availability Architecture
设计 99.99% 可用性的系统,掌握负载均衡、容灾、降级等核心策略。
1// 加权轮询负载均衡器2type WeightedRoundRobin struct {3 nodes []*Node4 current int5 mu sync.Mutex6}7 8type Node struct {9 Address string10 Weight int11 Current int12 Health bool13}14 15func (wrr *WeightedRoundRobin) Next() *Node {16 wrr.mu.Lock()17 defer wrr.mu.Unlock()18 19 total := 020 var best *Node21 22 for _, node := range wrr.nodes {23 if !node.Health {24 continue25 }26 node.Current += node.Weight27 total += node.Weight28 29 if best == nil || node.Current > best.Current {30 best = node31 }32 }33 34 if best != nil {35 best.Current -= total36 }37 return best38}39 40// 健康检查41func (wrr *WeightedRoundRobin) HealthCheck(ctx context.Context) {42 ticker := time.NewTicker(5 * time.Second)43 for {44 select {45 case <-ticker.C:46 for _, node := range wrr.nodes {47 node.Health = wrr.ping(node.Address)48 }49 case <-ctx.Done():50 return51 }52 }53}1type CircuitBreaker struct {2 state State3 failures int4 successes int5 threshold int6 timeout time.Duration7 lastFailure time.Time8 mu sync.RWMutex9}10 11func (cb *CircuitBreaker) Execute(fn func() error) error {12 if !cb.AllowRequest() {13 return ErrCircuitOpen14 }15 16 err := fn()17 18 cb.mu.Lock()19 defer cb.mu.Unlock()20 21 if err != nil {22 cb.failures++23 cb.lastFailure = time.Now()24 if cb.failures >= cb.threshold {25 cb.state = Open26 }27 return err28 }29 30 if cb.state == HalfOpen {31 cb.successes++32 if cb.successes >= cb.threshold {33 cb.state = Closed34 cb.failures = 035 }36 }37 return nil38}