知识卡片

高可用系统必备的三种流控场景

普通读书笔记卡

内容

[[N加2冗余标配与实例对等独立原则]]之外,想做到高可用,还必须拥有一套非常可靠的流量控制系统——按源IP、目标IP这类常见维度来调度是不够的,最好能按业务维度调度流量(按API、甚至按用户类型、用户来源)。一个高可用系统必须支持三种典型场景。Isolation(隔离):A用户和B用户发来的请求同时处理时可能产生资源冲突,因此需要在流量层面把不同来源的请求隔离开,避免互相干扰。Quarantine(隔离检疫):某类用户的请求资源消耗可能超标,必须把这类请求钉死在有限的几个节点上处理,这样即便这类请求造成了局部问题,也不会波及全局、能顾全大局。Query-of-death(死亡查询):这是每个做过线上服务的人都遇到过的场景——上线后某个用户发来一个异常请求,直接把服务打挂,如果这类异常请求连续多发几次,整个集群都可能挂掉;对这类问题的防范措施是,系统要能在死掉几台服务器之后自动屏蔽掉类似的请求,具体做法需要结合业务场景具体分析(比如做一层智能的业务Proxy,检测到哪类请求会导致后端挂掉就自动拦截;或者在处理请求前先记日志”我要处理这个请求了”,如果处理到一半挂了,重启后检查上次是处理这个请求时挂的,就自动屏蔽这个请求)。这三种场景有一个共同前提:它们都是必然会遇到的问题,而且”靠人”是完全没戏的——必须靠系统在架构层面预先建好流量控制的能力,因为异常流量往往是突发的、瞬时的,等人工发现、判断、处理,早就来不及了。

参考来源

- 位置:《高可用架构(第1卷)》第1章《高可用架构案例精选》"1.8 来自Google的高可用架构理念与实践"节,"1.8.2 高可用性方案"(源文件:_epub-src/OEBPS/Text/Chapter1_8_3.xhtml) - 结论依据:原文列出"Isolation……Quarantine……Query-of-death"三种场景及各自的应对思路("对这种类型的防范就是要在死掉几台服务器之后可以自动屏蔽类似的请求"),并强调"这些都是必备的,也是一定会遇到的场景。还是那句话,靠人是没戏的",直接支撑本卡片结论。 - 原始内容:Query-of-death。大家都遇到过吧。上线之后一位用户发来一个异常请求,直接搞挂服务。连续多发几个,整个集群都挂没了,高可用还怎么做到?那么,对这种类型的防范就是要在死掉几台服务器之后可以自动屏蔽类似的请求。