知识卡片

降级开关设计:多级读服务链路、开关前置化与业务线程池隔离

普通读书笔记卡

内容

一个前端提供服务的系统必须系统性地考虑降级能力,而不是事后补救。降级设计包含三个互相配合的层面:一是可降级的多级读服务链路——数据获取的路径按”前端数据集群→数据异构集群→动态服务(调用依赖系统)”分层设计,任何一层故障都可以退回到更上一层去获取数据(比如前端集群某台机器磁盘坏了,可以回源到数据异构集群继续提供服务),这样单点的磁盘故障、机器故障或机架故障都不会直接导致服务不可用,代价是链路上层的响应会变慢,但服务本身不会中断;二是开关前置化,把降级开关尽量往请求链路的最前端放(比如放在Nginx而不是放在Tomcat这类应用容器里),一旦开关触发,请求根本不会到达后端应用,从源头上减少后端压力,而不是让请求先打到后端、再在业务代码里判断要不要降级;三是可降级的业务线程池隔离,利用Servlet 3以后支持的异步事件模型,把”用Tomcat线程池解析请求”和”用自己的线程池处理业务”这两件事分开,不同业务再各自建立独立的线程池,这样某个慢速业务(A业务)处理慢,只会拖慢它自己的线程池,不会连带影响其他业务共用的Tomcat线程池,出问题时甚至可以直接清空某个业务专属的线程池来快速止损,还能针对每个线程池单独监控。这三层降级设计的共同思路是:故障隔离和降级能力不能指望”事后加个开关”就够了,而要在架构层面预先设计好多条可以退让的路径(多级读链路)、把控制权尽量前移(开关前置化)、把不同业务的处理资源提前物理隔离开(线程池隔离),这样故障发生时才有真正可以切换的余地,而不是临时手忙脚乱。

参考来源

- 位置:《高可用架构(第1卷)》第3章《电商架构热点专题》"3.1 亿级商品详情页架构演进技术解密"节,"3.1.2 商品详情页发展史"(源文件:_epub-src/OEBPS/Text/Chapter3_1_3.xhtml) - 结论依据:原文说明"可降级的多级读服务,前端数据集群→数据异构集群→动态服务(调用依赖系统)……开关前置化,如Nginx代替Tomcat……可降级的业务线程池隔离……我们可以为不同的业务再建立不同的线程池进行控制……这样tomcat线程池就不是我们的瓶颈",直接支撑本卡片结论。 - 原始内容:可降级的多级读服务,前端数据集群→数据异构集群→动态服务(调用依赖系统)……开关前置化,如Nginx代替Tomcat,在Nginx上做开关,请求就到不了后端……我们可以为不同的业务再建立不同的线程池进行控制……这样tomcat线程池就不是我们的瓶颈。