知识卡片

分级隔离机制的四个维度与真实故障验证

结构图卡

内容

美拍在服务治理上采用了分级隔离机制,一共通过四个维度进行隔离:核心和非核心的隔离、单一集群的内部隔离、不同集群的外部物理资源隔离、不同集群的外部依赖资源的隔离。美拍发展早期和多数早期系统一样,大部分接口部署在同一个集群里、还共用一些资源(比如memcached),好处是部署足够简单,但随着业务复杂度和接口调用量的提升,这种”大杂烩”式部署逐步暴露出问题——书中给出一个真实故障案例作为佐证:早期有个调用量不小的非核心业务,在对存储数据结构做调整上线的过程中出现性能问题,结果导致整个集群的服务都受到影响;虽然通过降级策略和运维配套设施快速解决了,但这次事故引发了团队更深的思考。团队的应对分两步走。第一步是接口层面的核心/非核心隔离:在七层和应用层把核心业务和非核心业务做了部署上的隔离,做完这一步之后接口之间互相依赖影响的问题降低了很多。第二步是进一步的内部隔离:核心业务或非核心业务内部的接口之间仍然存在依赖影响问题,所以针对部分场景,通过限定每个接口最多能使用的固定处理线程数,来避免单个集群内某个接口出问题、拖垮整个集群的情况。除了接口层面,团队还在依赖的资源和外部服务方面做了拆分——如果没有相应隔离机制,同样会出现互相依赖影响的问题(比如典型的memcached slab calcification问题),因此在memcached、MySQL等核心资源层面也做了拆分。这条经验揭示的一般性原则是:分级隔离本质上是在解决服务之间的依赖影响问题,而这种隔离设计往往不是一开始就规划到位的——早期系统为了部署简单而共用资源是合理的权衡,只有当业务复杂度和调用量真正涨到会暴露耦合风险的规模时,付出隔离改造的代价才是划算的;同时团队也强调要在开发效率、系统架构、部署运维成本等方面保持平衡,避免过度设计,也要避免架构支撑不住业务这两个极端。

结构图

flowchart TD
    A["早期:所有接口共用集群和资源\n(如memcached),部署简单"] --> B["业务复杂度和调用量提升"]
    B --> C["非核心业务上线故障\n拖垮整个集群"]
    C --> D["第一步:核心/非核心\n部署隔离(七层+应用层)"]
    D --> E["第二步:单一集群内部隔离\n限定每接口固定处理线程数"]
    D --> F["资源层隔离\nmemcached/MySQL等按需拆分"]

参考来源

- 位置:《高可用架构(第1卷)》第1章《高可用架构案例精选》"1.6 亿级短视频社交美拍架构实战"节,"1.6.4 为支持亿级用户,美拍架构所做的一些改进"(源文件:_epub-src/OEBPS/Text/Chapter1_6_5.xhtml) - 结论依据:原文说明"曾经有个调用量不小的非核心的业务,在对存储数据结构做了调整后的上线过程中出现性能问题,导致整个集群服务都受到一定的影响……我们在七层和应用层把核心业务和非核心业务做了部署上的隔离……接下来更进一步,针对部分场景也做了内部隔离,通过限定每个接口最多只能使用的固定处理线程数方式",直接支撑本卡片结论与结构图。 - 原始内容:曾经有个调用量不小的非核心的业务,在对存储数据结构做了调整后的上线过程中出现性能问题,导致整个集群服务都受到一定的影响……综合来看,分级隔离本质上也是在解决服务之间依赖影响问题。