加权下第 3 个发给谁
按模型,权重 [2, 1]、weighted_pick([2, 1], 2) 交回哪个下标?
贯穿本节的负载均衡模型:rr(n, k) 轮询——第 n 个请求(从 0 数)发给第 n%k 个后端;weighted_expand(权重) 把下标按权展开成一轮([2,1]→[0,0,1]),weighted_pick(权重, n) 加权轮询第 n 个;distribute(k, 总数) 交回每个后端各接几个(下标 0 先多拿余数);least_conn(连接数) 发给连接最少的;total_weight/spread_ok 权重之和 / 是否都为正。
def rr(n, k):
# 轮询:第 n 个请求(从 0 数)发给第 (n % k) 个后端,交回下标
return n % k
def weighted_expand(weights):
# 加权轮询:按权重把后端下标展开成一轮序列,如 [2, 1] -> [0, 0, 1]
seq = []
for i, w in enumerate(weights):
seq += [i] * w
return seq
def total_weight(weights):
return sum(weights)
def weighted_pick(weights, n):
# 第 n 个请求(从 0 数)按加权轮询发给哪个后端下标
seq = weighted_expand(weights)
return seq[n % len(seq)]
def distribute(k, total):
# total 个请求轮询分给 k 个后端,交回每个后端各接了几个(下标 0 先多拿余数)
return [total // k + (1 if i < total % k else 0) for i in range(k)]
def least_conn(conns):
# 最少连接:把新请求发给当前连接数最少的后端(并列取下标小的)
return conns.index(min(conns))
def spread_ok(weights):
# 权重都是正数才是合法的加权配置
return all(w > 0 for w in weights)
print(weighted_pick([2, 1], 2))
全部评论