慧扬健康基于业务等级的限流设计
背景
在慧扬健康医疗信息化项目建设中,为了避免在高并发的情况下因为请求量过大造成的业务处理系统资源耗尽导致业务中断的问题,在设计阶段,慧扬健康在核心业务处理模块中增加限流机制。
技术架构
在业务流程中,后端采用的3层架构,分别用于处理不同的业务:
如上,不同的业务放在不同的服务器上,以N+1的方式实现负载均衡。但是对于单个应用来说,资源是固定的,因此希望通过限流来限制同时进行的业务处理请求数量。考虑到每个业务请求所耗费的资源巨大,慧扬健康希望能精确控制不同业务的并发量。同时,因为不同的业务优先级不一样,我们需要让系统在资源不够的情况下能优先保证高优先级任务的请求能被执行。基于以上需求,参考了下当前主流的限流方式后,我们以类似于令牌桶的方法设计了下列的一个限流模式:
1、不同的业务类型有单独的令牌桶,每个业务桶里的令牌数不一样。对于一些资源开销小,处理速度快,请求量比较大的业务类型,给予更多的令牌数;而对于资源开销大,处理速度慢,请求量比较小的业务,令牌数响应地减少。
如上,不同颜色代表不同的请求类型,通过能否获取对应的令牌来决定是否能发送该业务请求到业务处理系统。
2、令牌数在应用初始化时生成,不采用刷新机制,而是在每次需要发送业务请求到业务系统时从该类型的业务令牌桶中获取令牌,获取到则该令牌桶令牌数减1,而后当接受到该请求的第一条响应消息或者请求错误时将令牌放回令牌桶,通过这样的方式来保证令牌数的总数。
3、考虑到业务类型不一样,优先级不一样,同时不同业务有不同的令牌桶,为了保证在高并发场景下高优先级的业务能得到有效执行,我们设置了令牌占用机制。也就是说,高优先级的令牌数不够的时候,可以占用低优先级的的令牌,从而保证高优先级的任务能够被有效执行,同时又能保证整个业务系统同时处理的业务请求不超过一定限制。此外,对于一些特定的优先级比较高,业务比较独立的业务,拥有不可被占用的令牌桶,同时也不得占用别人的令牌。
综上,通过这样的设计,我们对业务处理的并发进行了限流控制,同时又根据优先级设置了一定的弹性,在系统的能力范围之类,允许不同的业务组合同时被处理,并优先保障了高优先级业务的及时响应。
后续
限流的设计完成只是开始,在后续的测试中我们发现更多的问题出在令牌数的设置是否合理,负载均衡是否有效等一系列的原因上。对于令牌数的设置,因为不同的设备性能不一样,业务吞吐量也不一样,因此需要针对不同的服务器配置进行基于特定的业务组合的性能测试,找到性能较优的令牌组合才能在不影响业务系统的情况下尽量达到最优的业务处理能力。