【】面向失败的设计之播控系统!

【】面向失败的设计之播控系统!
文章图片

文章图片

作者 | 阿里文娱高级开发工程师 云琰浅
责编 | 屠敏
谈面向失败的设计
1、什么是面向失败的设计?
面向失败的设计 , 就是以“失败”为对象 , 天然为了失败而存在的设计思想 , 在一开始的系统设计阶段就考虑到各种失败场景 , 把面向失败当成是系统设计的一部分 , 准备好从失败中恢复的策略 。
2、为什么要面向失败设计?
因为无所不在的失败场景 , 比如硬件问题 , 软件bug , 配置变更错误 , 系统恶化 , 超预期流量 , 外部攻击 , 依赖库问题 , 依赖服务问题 。
【【】面向失败的设计之播控系统!】并且 , 这些一旦失败 , 轻则出现业务不可用 , 影响用户体验和企业声誉;重则导致数据永久丢失、业务再无恢复可能 。例如 , 911事故发生前 , 约有350家企业在世贸大厦工作 。事故后 , 有200家企业由于重要系统被破坏 , 关键数据丢失而倒闭 。
【】面向失败的设计之播控系统!
文章图片

文章图片

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

文章图片

播控是如何实现面向失败设计的
1、播控架构设计
【】面向失败的设计之播控系统!
文章图片

文章图片

优酷播放控制系统从层级结构上将系统分成3层 , 对外服务层、基础服务层、数据存储层 。
第一层:对外服务层包含播控SDK , 播控查询服务,播控变更服务,播控筛选服务
第二层:基础服务层包含播控任务调度,播控数据库服务;
第三层:数据存储层包含分布式缓存 , 数据库 , 开放搜索 。
从功能上 , 播控系统共3大核心线路读核心、写核心、筛选服务 。
线路一:读核心是整个系统的核心服务 , 负责优酷、土豆、天猫视频展示、透出能力;
线路二:写核心负责整个系统策略变更核心服务;
线路三:筛选服务提供管理后台多数据源筛选服务 。
这样设计的特性如下:
1) 线路上读、写分离 , 核心与筛选分离(主次分离) , 单独链路变更失败之后不会影响核心链路的功能;
2) 核心高并发查询服务读取数据库方式从数据库服务隔离开 , 当压力增加后 , 无单点瓶颈 , 可以无限扩展;
3) 任一链路故障 , 其他链路正常运行 , 稳定提供服务;
4) 数据库服务遵从容量设计原则 , 针对查询服务、变更服务相同接口有不同限流策略 。
2、数据库不可用兜底设计
数据库兜底设计的目的在于在数据库不可用的极端场景下 , 保证生产链路不挂 , 且不会影响到业务方 。实现方式通过全局统一开关 , 切换核心读链路和写链路使用缓存作为临时的数据持久层 , 并把数据变更堆积在消息队列中 , 待数据库可用后再切换回数据库 , 并消费消息队列 。
【】面向失败的设计之播控系统!
文章图片

文章图片

读链路数据库兜底流程


推荐阅读