Skip to content

Day 6 技术设计文档 — 服务发现与负载均衡

Discovery 接口层次

XClient 架构

负载均衡策略对比

策略实现适用场景复杂度
Randomrand.Intn(n)无状态服务、节点性能均匀O(1)
RoundRobinindex++ % n请求耗时均匀的场景O(1)
WeightedRR加权轮询节点性能不均(可扩展)O(n)
ConsistentHash一致性哈希有状态、缓存亲和(可扩展)O(log n)

Broadcast 并发实现

go
func (xc *XClient) Broadcast(ctx context.Context, ...) error {
    ctx, cancel := context.WithCancel(ctx)
    defer cancel()

    for _, addr := range servers {
        go func(addr string) {
            err := xc.call(addr, ctx, ...)
            mu.Lock()
            if err != nil && e == nil {
                e = err
                cancel()  // 快速失败:取消其余请求
            }
            mu.Unlock()
        }(addr)
    }
    wg.Wait()
    return e
}

关键点:

  • 使用 context.WithCancel 实现快速失败
  • sync.Mutex 保护共享的 error 变量
  • reply 使用 reflect.New 克隆,避免并发写入同一对象

连接池设计

XClient 的 clients map[string]*Client 实现了简单的连接缓存:

  • 首次调用某地址时创建新连接并缓存
  • 后续调用复用已有连接
  • 连接不可用时自动重建