-
Notifications
You must be signed in to change notification settings - Fork 4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add balance optimal strategy #168
Conversation
客户端跟服务端都定义一个相同的空域名,测速阶段客户端对这个空域名进行访问,服务端收到这个空域名的请求后直接返回一个预设定的回复是不是好点。 |
Nice work. |
这个策略的测试并非是测试延迟,是基于实际速率。 |
shadowsocks-rust的需要研究下。。。 |
对于持续丢包的代理有效, 但实际情况是代理间歇性丢包呢? 唯一的解决方法是调低测试间隔. |
确实如此, 目前调低测试间隔才会对网络的稳定性更敏感.
这个其实算是具体的策略了, 他的稳定性是基于什么评估的? |
10分钟综合评估似乎更能体现网络一段时间的整体稳定性. |
详情可以看他的代码 |
@badO1a5A90 |
这个 PR 可以merge 了吗? 需要这个功能 |
功能不错 期待打磨 |
Please merge this! |
a80df64
to
707efd6
Compare
请问 1.5.2 的code 要怎么将这篇也给修改上去呢? 是基于运营商可能会对伺服器限速, 找了好多才找到这、发现还没 merge上去 |
d62f536
to
79f3057
Compare
这个PR还有后续跟进的计划吗? |
What is holding this back from a merge? |
961014c
to
a4d1509
Compare
a6df210
to
05d24d6
Compare
c73e413
to
a4e80f0
Compare
One can feel its absence. |
这个pr什么时候可以合并啊? |
非常期待这个PR的合并 |
能不能加个轮询策略? |
考察了一下 v2fly 的 leastload 综合看来它的实现更加完整 比如 记录多次结果平均和方差 测量排除本地网络不通 Observer Balancer 配置分离 API 支持 等等
|
原来的 balancer 只有一种策略,即随机策略, balancer 在配置的一组 outbound 中每次随机选择一个作为实际的outbound, 比较鸡肋.
这里增加了一种新的策略, 且以后还可以增加不同的策略模式.
如果不指定使用策略, 不会有任何影响。
此策略包含自动择优选择,故障转移
即可以择优选择一组 outbound 中最佳的一个作为实际outbound, 因此在当前 outbound 故障/不稳定时,也自然会进行故障转移.
并且可以自行配置权重及其他参数进行控制
策略原理
此策略的原理是, 为 balancer 配置一组 outbound 后, balancer 按时间间隔 (可配置)使用每个 outbound 向指定的目标URL(可配置)进行N次(次数可配置)访问进行测速. 策略计算测速的速率(多次测速则取平均值), 乘以此 outbound 的权重(可配置), 计算得到最终得分.
所有outbound同时开始,并且在指定时间(可配置)内必须结束(在指定时间内未能完成测试的得分为0).
结束所有测试后, 策略将选择得分最高的 outbound 作为此 balancer 后续处理连接请求时实际使用的outbound, 持续到下一轮测试.
配置方式
首先假设有3个outbound,名称为 proxy1,proxy2,proxy3
原配置方式为
如果还是用随机策略, 仍用此配置即可,对于每个新连接 balancer 将在 ["proxy1","proxy2","proxy3"] 中随机选择一个作为 outbound.
新的 balancer 配置如下
配置简要说明:
strategy: 指示使用哪一种策略, 填"optimal"为使用最优策略, 不填或者填"random"即为以前的随机策略,
以后可以增加更多的 strategy .
optimalSettings是使用"optimal"时的具体配置.
实例说明
实例1
最简单的情况, 用户有2个服务器, 于是在客户端配置了两个 outbound "proxy1"和 "proxy2" 指向两个服务器.
其中 "proxy1"为较快常用线路,"proxy2"为备用线路。
希望在proxy1不稳定,或服务器down掉以后可以自动切换到"proxy2",常用场景是普通正常上网场景.
则可以这样配置.
路由配置此处将http和socks的outbound指向balancer仅为示范, (路由配置可以非常多样化,此处不展开),
关键是使用 "balancerTag": "balancer" 来指定 balancer
以上配置, 每隔30秒,proxy1和proxy2,都会访问 "https://about.google" ,进行测速. 测试需要在2秒内完成,否则认为超时.(一次完整 "https://about.google" 访问大小约80k,一般0.x秒即可完成测试), 测试次数1次.
通常情况下,因为proxy1权重为proxy2两倍,且已经假设理论上常用线路proxy1即使不加权也应快于proxy2.
因此每一轮测试后, 会有以下情况:
即 每隔30秒, balancer都会再次尝试选择当前最优的线路作为出口, 并且在接下去30秒保持使用此线路作为outbound,然后再次进行测试和选择.
根据实际的线路情况和需求, 可以通过控制测速的间隔 和 设计合理权重值 来获取最佳体验.
实例2
较复杂的情况, 假设用户有6个服务器,
其中 1-3线路类似,4-5线路类似,6线路类似.用户希望可以按3条线路择优选择,并且每条线路中的各个服务器轮询进行负载
可以如下配置,注意:下面的配置为不完整配置, 旨在说明模式
配置较长, 请点击此处展开查看
其中 "vnext": 中的服务器组是轮询的.
balancer 和 实例1 类似 , 每30秒进行一次测试, 选择当时最好的 proxy 作为 outbound,
如果此 proxy 内有多个服务器,则轮询进行负载.
权重指定了300:200:100,即主要倾向选择proxy1,其次倾向选择proxy2,当proxy1,proxy2均不稳定或者故障,倾向于使用proxy3.
其他用法技巧和注意点