RPC中常用的保护手段“熔断限流”,熔断是调用方为了避免在调用过程中,服务提供方出现问题的时候,自身资源被耗尽的一种保护行为;而限流则是服务提供方为防止自己被突发流量打垮的一种保护行为。虽然这两种手段作用的对象不同,但出发点都是为了实现自我保护,所以一旦发生这种行为,业务都是有损的。
对于突发流量。限流固然是一种手段,但面对复杂的业务以及高并发场景时,还有别的手段,可以最大限度地保障业务无损,那就是隔离流量
。
为什么需要分组?
在早期业务量不大的情况下,应用之间的调用关系并不会复杂,请求量也不会很大,应用有足够的能力扛住日常的所有流量。不需要花太多的时间去治理调用请求过来的流量,简单的方法,服务实例统一管理,把所有的请求都用一个共享的“大池子”来处理
。
后期因为业务发展丰富了,调用接口的调用方就会越来越多,流量也会逐渐增多。
突然,一个调用方的流量突然激增,让整个集群瞬间处于高负载运行,进而影响到其它调用方,导致它们的整体可用率下降。
把应用提供方这个大池子划分出不同规格的小池子,再分配给不同的调用方,而不同小池子之间的隔离带,就是RPC分组,可以实现流量隔离。
如何实现分组?
为了实现分组隔离逻辑,需要重新改造下服务发现的逻辑,调用方去获取服务节点的时候除了要带着接口名,还需要另外加一个分组参数,相应的服务提供方在注册的时候也要带上分组参数
。
服务提供方所有的实例分成若干组,每一个分组可以提供给单个或者多个不同的调用方来调用。
如何实现高可用?
分组隔离后,单个调用方在发RPC请求的时候可选择的服务节点数相比没有分组前减少,那对于单个调用方来说,出错的概率升高。
一个集中交换机设备突然坏了,而这个调用方的所有服务节点都在这个交换机下面,在这种情况下对于服务调用方来说,它的请求无论如何也到达不了服务提供方,从而导致这个调用方业务受损。
允许调用方可以配置多个分组,调用方设置主次分组
,只有在主分组上的节点都不可用的情况下才去选择次分组节点;只要主分组里面的节点恢复正常,必须把流量都切换到主节点,整个切换过程对于应用层完全透明,从而在一定程度上保障调用方应用的高可用。