防微杜渐的稳定性法宝:播控系统面向失败的设计

简介: 什么是面向失败的设计? 为什么要面向失败设计?怎么面向失败设计?播控是如何实现面向失败设计的?一篇文章带你读懂~

作者| 阿里文娱高级开发工程师 云琰

一、浅谈面向失败的设计

1. 什么是面向失败的设计?

面向失败的设计,就是以“失败”为对象,天然为了失败而存在的设计思想,在一开始的系 统设计阶段就考虑到各种失败场景,把面向失败当成是系统设计的一部分,准备好从失败中恢 复的策略。

2. 为什么要面向失败设计?

因为无所不在的失败场景,比如硬件问题,软件 bug,配置变更错误,系统恶化,超预期流量,外部攻击,依赖库问题,依赖服务问题。
并且,这些一旦失败,轻则出现业务不可用,影响用户体验和企业声誉;重则导致数据永 久丢失、业务再无恢复可能。例如,911 事故发生前,约有 350 家企业在世贸大厦工作。事故 后,有 200 家企业由于重要系统被破坏,关键数据丢失而倒闭。

image.png

3. 怎么面向失败设计?

在软件的整个生命周期中,不同的阶段面对失败场景有不同的应对规则。在设计阶段将系 统的架构简单化,结构层次分明;在发布阶段尽量做到最小变更原则,小规模,多次迭代;在运维阶段做好周期性压测,最小依赖。

image.png

二、播控是如何实现面向失败设计的

1. 播控架构设计

image.png

优酷播放控制系统从层级结构上将系统分成 3 层,对外服务层、基础服务层、数据存储层。
第一层:对外服务层包含播控 SDK,播控查询服务,播控变更服务,播控筛选服务;
第二层:基础服务层包含播控任务调度,播控数据库服务;
第三层:数据存储层包含分布式缓存,数据库,开放搜索。

从功能上,播控系统共 3 大核心线路读核心、写核心、筛选服务。
线路一:读核心是整个系统的核心服务,负责优酷、土豆、天猫视频展示、透出能力;
线路二:写核心负责整个系统策略变更核心服务;
线路三:筛选服务提供管理后台多数据源筛选服务。
这样设计的特性如下:
1)线路上读、写分离,核心与筛选分离(主次分离),单独链路变更失败之后不会影响核心链路的功能;
2)核心高并发查询服务读取数据库方式从数据库服务隔离开,当压力增加后,无单点瓶颈, 可以无限扩展;
3)任一链路故障,其他链路正常运行,稳定提供服务;
4)数据库服务遵从容量设计原则,针对查询服务、变更服务相同接口有不同限流策略。

2. 数据库不可用兜底设计

数据库兜底设计的目的在于在数据库不可用的极端场景下,保证生产链路不挂,且不会影 响到业务方。实现方式通过全局统一开关,切换核心读链路和写链路使用缓存作为临时的数据 持久层,并把数据变更堆积在消息队列中,待数据库可用后再切换回数据库,并消费消息队列。

image.png

读链路以查询是否资源是否可播为例,兜底开关打开,则只查询缓存中是否存在该资源。 若缓存中存在资源,则返回查询结果。若不存在,则判断资源是否在禁播黑名单,根据判断结 果返回是否可播。可见兜底开关打开后,虽然返回的是降级之后的结果,但至少摆脱了对数据 库的依赖,整个流程仍能正常进行下去。

image.png

写链路以新增资源策略为例,兜底开关打开,则先查询缓存中是否存在该资源策略。若缓 存中存在该资源策略,则流程结束。若不存在,则更新缓存,并发送消息,用于延时消费,更 新数据库。可以看到思路仍然是以缓存作为临时数据源,降低对数据库的依赖,同时借助了消 息队列的异步特性,来解决数据库恢复后,数据库数据与缓存数据的一致性问题。

3. 缓存冗余更新和缓存一致性检测设计

高并发的业务场景下,数据库是十分宝贵的资源,也是非常薄弱的环节。系统设计时不可 避免的需要使用缓存作为缓冲。上一小节针对数据库不可用的极端场景设计了方案,本小节将 会提出两种解决缓存与数据不一致问题的方案。
1)缓存冗余更新 缓存冗余更新是在数据发生变更时,通过同步与异步冗余更新的方式,保证不会出现脏数
据,并且保证最终的数据一致性。

image.png

1-2-6-7 即为一个常见的旁路缓存更新结构。但由于业务的复杂性,在播控变更服务执行完
数据变更后,需要通过步骤 3 发消息通知外部系统,外部系统接收到消息后通过步骤 4-5 进行
反查,但由于步骤 3 和步骤 6-7 都是异步过程,可能在 6-7 执行完成之前,3-4-5 已经执行,则 查询到的是更新之前的脏数据。
缓存冗余更新的思路是,变更服务除了通过消息异步更新缓存之外,同步的调用播控任务 调度,去更新缓存。同步更新保证缓存数据的准确性,不会出现脏数据,异步更新保证更新链 路的高可用,不会因为接口调用失败而导致缓存更新失败,达到最终数据的一致性。
2)缓存一致性检测 缓存冗余更新是用来确保写入缓存时数据的正确性。除此之外,我们还提供一种写入缓存
后的缓存一致性检测机制,专门检查近期写入缓存的数据是否符合预期,检测到不一致后进行
上报和清理。
检测流程如下,利用 guava cache 设置 5s 过期机制,在数据变更写入数据库和缓存的 5s 之 后,通过监听器监听 guava cache 的过期,来触发数据对比的检测,并根据检测结果做出相应的处理。

image.png

4. 远端/近端调用动态切换设计

播控除了通过 RPC 调用方式为上游业务提供基础服务,还提供了播控 SDK 可以供业务方 进行近端调用。近端调用对于业务方来说在降低延时,提高成功率方面都有很好的效果,对于 播控来说也能减轻服务器压力,节省资源。但为了防止出现稳定性问题,也必须面向失败设计, 提供降级方案,其中一种降级方案是流量动态切换方案。当业务方机器能够承受的 SDK 流量上 限超过阈值时,多余的流量会动态分散到播控中心系统;这在实际中是很有效的,在一些单机 QPS 达到 1000 甚至更高的场景下,确保 SDK 不会压垮业务方机器。极端情况下,所有流量都 可以回切到播控中心系统。

三、总结

一个优秀的架构师往往都是悲观主义者,除了设计好能够支撑业务持续发展的优雅架构, 另一个容易被忽略的重要能力在于充分考虑失败场景。面向失败设计是一种十分重要的设计思 路,需要能够防患于未然,在设计阶段考虑到各种失败场景,提前准备好预案,并且做好充分 的演练和验证。只有这样才能够在失败来临时从容应对。

相关文章
|
机器学习/深度学习 人工智能 算法框架/工具
《YOLOv10魔术师专栏》专栏介绍 & 专栏目录
【7月更文挑战第4天】 【原创自研模块】【多组合点优化】【注意力机制】 【主干篇】【neck优化】【卷积魔改】 【block&多尺度融合结合】【损失&IOU优化】【上下采样优化 】 【小目标性能提升】【前沿论文分享】【训练实战篇】
457 1
|
2月前
|
存储 人工智能 缓存
AI问诊系统开发架构解析:大模型 + 医疗知识库如何落地
本文详解可商用AI问诊系统落地实践:摒弃纯对话模式,采用“大模型+医疗知识库(RAG)+分诊规则引擎+业务系统”四层架构,解决幻觉、不可控、非结构化、合规风险等核心痛点,涵盖架构设计、知识检索、症状抽取、智能分诊与生产级部署关键代码与经验。(239字)
|
4月前
|
人工智能 程序员 开发者
代码写完就忘?用这条AI指令给你的代码装上"说明书"
面对无注释的"天书"代码感到头秃?本文提供一套专业的AI指令,化身资深文档工程师,一键为代码生成清晰、规范的注释。告别"孤儿代码",让技术资产真正保值。
331 2
|
4月前
|
数据采集 人工智能 数据可视化
2025年数据中台系统选型指南:热门推荐与能力盘点
2025年,数据中台成为企业数字化转型核心。本文深度解析瓴羊Dataphin、腾讯云WeData、华为云DataArts Studio、网易数帆EasyData及Talend Data Fabric五大主流平台,从产品能力、行业实践、技术优势等维度对比分析,助力企业实现数据标准化、治理高效化与消费便捷化,释放数据价值,提升竞争力。
|
5月前
|
人工智能 决策智能
清华大学“Al+经管 零基础玩转大模型”AI Day举办成功丨云工开物
2025年11月13日,清华经管学院CDC联合阿里云举办“AI+经管”AI day,百余名学生参与。活动通过“讲座+实践”形式,聚焦大模型在经管领域的应用,涵盖金融智能体、多智能体协同、零代码数据看板等实战内容,助力学生掌握AI技能,推动AI与专业融合,提升数智时代竞争力。
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
职业能力培养笔记 人工智能训练师(高级)
本课程涵盖智能语音技术与自然语言处理核心内容,包括语音合成(TTS)与语音识别(ASR)原理及应用、文本生成模型、意图识别算法等,适用于智能客服、语音助手等场景,助力AI技术实战能力提升。
318 0
|
机器学习/深度学习 人工智能 自然语言处理
探索人工智能的无限可能:技术前沿与应用实践
【10月更文挑战第23天】探索人工智能的无限可能:技术前沿与应用实践
|
9月前
|
前端开发 Java 开发者
SpringBoot 3 + Flutter3 实战低代码运营管理
Spring Boot 3 与 Flutter 3 强强联合,助力现代 Web 与移动应用开发。Spring Boot 3 提升后端开发效率,支持最新 Java 特性;Flutter 3 实现跨平台高性能 UI,热重载加速前端迭代。两者结合打造高效、可扩展的应用开发新体验。
347 0
|
SQL 安全 数据库
南大通用GBase 8s 查看用户权限查询指南
本文详细介绍了南大通用GBase 8s数据库中用户权限的查看与管理方法,涵盖数据库级别和表级别权限的定义、查看及赋权操作,以及相关系统表的使用,旨在帮助数据库管理员有效维护数据访问安全。
|
存储 前端开发 rax
x64汇编语言与逆向工程基础指南(三)
x64汇编语言与逆向工程基础指南(三)

热门文章

最新文章