全面消除变更态风险的回顾
现在来回顾一下,变更态存在哪些问题,以及 MSE 是如何全面消除变更态风险的。
首先问大家一个问题,当你的代码没有问题的时候,是不是在发布的过程中就一定不会影响到业务?答案其实是否定的,因为这个时候可能会遇到无损上下线的问题。
为什么会出现无损下线问题?第一个原因是服务消费者无法实时感知到服务提供者已经下线了,仍旧会去调用一个已经下线的地址,从而出现一个影响业务的报错。同时服务提供者也可能会在请求处理到一半的时候就直接停止了,从而导致业务报错,甚至出现数据不一致的问题。
为什么会出现无损上线的问题?一个新启动的节点,有可能在还没完全启动前就注册到注册中心了,进而导致这时候过来的流量无法被正确处理导致报错;另一种情况是,虽然应用启动完成了,但是还没有处理大流量的能力,可能直接被大流量压垮,需要先进行预热,才能处理大流量的请求。除此之外,目前 K8s 的普及率已经非常高了,如果微服务的生命周期没有与 K8s 生命周期做一个的 readiness 对齐的话,发布过程也容易出现无损上线问题。
当然更普遍的情况是,谁都不敢拍着胸脯保证我的代码没有问题。如果没有稳定的灰度机制,对只有两个节点的应用来说,发布一台就会影响 50% 的业务。发现 bug 之后需要回顾,可怕的是回滚的速度还非常慢,甚至回滚的时候还出现了更大的问题。
那么 MSE 是如何去解决这两个问题的。首先我们看一下这个无损下线的这个问题。对于一个已经接入了MSE 微服务治理的应用,无损下线功能是默认开启的,我们可以在 MSE 的控制台中看到无损下线的完整的流程。
- 首先在无损下线开始时,sc-B 这个服务的提供者 10.0.0.242 会提前向注册中心发起注销动作。
- 注销之后,10.0.0.242 会去主动去通知它的服务消费者当前节点已下线。上图中的例子,服务 sc-B 的消费者 10.0.0.248 和 10.0.0.220 这两个消费者收到了下线通知。
- 10.0.0.248 和 10.0.0.220 在收到下线通知后,都会把 10.0.0.242 的地址维护在 offlineServerIp 列表中,并且找到 sc-B 对应的调用列表,在调用列表中移除 10.0.0.242 这个 IP
- 同时,10.0.0.242 在停止的过程中会做一个自适应的等待,确保所有在途请求都处理完毕才停止应用。
我们再看一下这个无损上线的这个问题。对于一个已经接入了 MSE 微服务治理的应用,可以通过控制台开启无损上线功能,开启后,我们可以在 MSE 的控制台中看到无损上线的完整的流程。
从上图中我们可以看到,应用配置的延迟注册时间是 10S,预热时间是 120S,预热曲线是拟合二次曲线。根据 QPS 数据可以看到,应用在注册完成之后才有流量进入,同时在预热开始后 120S 内,流量是一个缓慢上升的过程,直到预热结束之后,流量才开始进入平稳的状态。
看完了在代码没问题的情况下如何保证变更态的稳定性,我们在看看当代码可能存在问题的时候,如何保障变更态的稳定性。
拿一个简单的架构作为例子,微服务的整体调用链路是网关调用 A,A 调用 B ,B 再调用 C 这么一个链路。某次迭代中,有个特性的修改需要同时修改 A 和 C 这两个应用。
在发布的过程中,需要通过全链路灰度发布来验证 A 的新版本和 C 的新版本的正确性。假设 x-user-id 为 120 的用户是我们一个不那么重要的用户。那么我们可以配置只有 x-user-id 为 120 的这一个用户,他才会访问新版本。
在具体的调用中,网关会先访问 A 的灰度版本,A 在调用 B 的时候发现 B 没有一个灰度的版本,所以只是 fall back 到 B 的基线版本。但是 B 在调用 C 的时候,还是记住了 x-user-id 为 120 的流量属于一个灰度流量。同时又发现 C 存在灰度节点,流量还是会重新回到 C 的灰度节点。
如上图所示,可以通过 MSE 全链路灰度控制新版本的影响面。将参与到全链路灰度的应用添加到泳道组后,配置如上图所示的规则,只有 x-user-id 为 120 的这个用户他才会被路由到新版本。也就是说即使这个新版本问题再大,那只是这一个用户会受到影响。同时做一个回滚的动作也是非常方便的,只需要把灰度规则关闭或者删除即可,就不会有流量被路由到新版版本。经过灰度的谨慎验证后,可以视情况继续扩大灰度的影响面,或者直接全量发布,从而实现安全的版本变更。
刚才我们也提到过,全链路灰度其实是一个非常复杂的过程,除了 RPC 的灰度外,还包含了前端灰度、消息灰度、异步任务灰度、数据库灰度等场景,这些场景 MSE 都做了一些探索和支持。以消息灰度为例, MSE 已经完整地支持了 RocketMQ 的灰度,实现了全链路灰度的闭环,是一个久经生产考验的全链路灰度。
以上是 MSE 全面消除变更态风险的回顾。