在服务刚启动的时候,服务的运行状态并没有达到最佳,如果一下子将流量提升到日常运行的状态,会存在大量的请求超时。
为什么服务刚启动的时候,服务不是最佳状态呢?
为了服务达到最佳状态,我们通过调整服务权重慢慢增加流量,经过一段时间的小流量预热,让系统达到最佳运行状态。
某天我决定干这个事,我将权重由1调整到2,系统正常;由2调整到4,系统正常;将权重调整到9的时候,故障出现了。
将权重调整到9,网关将流量都打到了30多台机器上(一共168台机器),接着应用不断发生CMS GC,接口成功率直线下降。
下游没流量的机器
下游机器接口成功率
因为提前完全没有想到发生这种情况,一点预案也没有。后来冷静下来,想明白:这不应该是应用侧的问题,调整个权重就被打挂似乎没有这种道理。
系统交互图
机器不健康的时候,注册中心会剔除掉问题机器;机器恢复健康后,注册中心会再次将机器加入到列表中,【机器列表的顺序不会改变】。
举例说明:
网关从注册中心拿到List<Host>后,构造下游机器列表的逻辑:
构造下游机器列表
举例说明:
List<Host>中共有A1、A2、A3、A4四台机器,每台机器权重是3,该方法构造出的下游机器列表是:
[A1,A1,A1,A2,A2,A2,A3,A3,A3,A4,A4,A4]
当网关收到第一个请求的时候,选择下游机器列表的第一个机器;
当网关收到第二个请求的时候,选择下游机器列表的第二个机器;
依次轮询下游机器列表。
轮询逻辑
每当某台机器向注册中心发送心跳超时的时候,该接口在注册中心对于的机器列表就会变化;
网关会获取该接口新的机器列表List<Host>,并根据List<Host>重新构造一个新的下游机器列表;
新的请求会按照下游机器列表的顺序轮询发送到后端业务机器上。
业务应用有168台机器,定义为:A1,A2,A3… …A168;
网关有大概600台机器。