[alibaba/tengine]关于ngx_http_upstream_init_virtual_peers的调用问题

2024-05-15 497 views
1
Question

在ngx_http_upstream_get_vnswrr函数里有两个ngx_http_upstream_init_virtual_peers函数的调用,第一个调用我看明白了是在运行时分批初始化虚拟节点列表,但是第二个在for循环里面的调用是每次请求来到get peer的时候都会调用一次,我觉得没必要,可以删除。是这样吗?或者说使我哪里理解的有问题,能解答一下吗?

回答

9

@huhaipeng 看的很细心哈,第二个地方调用主要是为了解决第一批初始化末尾节点机器为down状态时导致的流量不均问题。比如下面的这个场景:

upstream test {
    server 127.0.0.1 weight=1;
    server 127.0.0.2 weight=1;
    server 127.0.0.3 weight=2;
    server 127.0.0.4 weight=1 down;
}

image

如果没有第二处的ngx_http_upstream_init_virtual_peers调用,则只会按照上面黑色区间轮训访问虚拟节点,虽然127.0.0.3的权重是2,但是最终看到的效果是按照1:1:1的轮训访问。如果增加ngx_http_upstream_init_virtual_peers后就会按照上图的红色箭头所在区间轮训机器列表。