【】面向失败的设计之播控系统!( 二 )
读链路以查询是否资源是否可播为例 , 兜底开关打开 , 则只查询缓存中是否存在该资源 。若缓存中存在资源 , 则返回查询结果 。若不存在 , 则判断资源是否在禁播黑名单 , 根据判断结果返回是否可播 。可见兜底开关打开后 , 虽然返回的是降级之后的结果 , 但至少摆脱了对数据库的依赖 , 整个流程仍能正常进行下去 。
文章图片
文章图片
写链路数据库兜底流程
写链路以新增资源策略为例 , 兜底开关打开 , 则先查询缓存中是否存在该资源策略 。若缓存中存在该资源策略 , 则流程结束 。若不存在 , 则更新缓存 , 并发送消息 , 用于延时消费 , 更新数据库 。可以看到思路仍然是以缓存作为临时数据源 , 降低对数据库的依赖 , 同时借助了消息队列的异步特性 , 来解决数据库恢复后 , 数据库数据与缓存数据的一致性问题 。
3、缓存冗余更新和缓存一致性检测设计
高并发的业务场景下 , 数据库是十分宝贵的资源 , 也是非常薄弱的环节 。系统设计时不可避免的需要使用缓存作为缓冲 。上一小节针对数据库不可用的极端场景设计了方案 , 本小节将会提出两种解决缓存与数据不一致问题的方案 。
1) 缓存冗余更新
缓存冗余更新是在数据发生变更时 , 通过同步与异步冗余更新的方式 , 保证不会出现脏数据 , 并且保证最终的数据一致性 。
文章图片
文章图片
缓存更新基本架构
1-2-6-7即为一个常见的旁路缓存更新结构 。但由于业务的复杂性 , 在播控变更服务执行完数据变更后 , 需要通过步骤3发消息通知外部系统 , 外部系统接收到消息后通过步骤4-5进行反查 , 但由于步骤3和步骤6-7都是异步过程 , 可能在6-7执行完成之前 , 3-4-5已经执行 , 则查询到的是更新之前的脏数据 。
缓存冗余更新的思路是 , 变更服务除了通过消息异步更新缓存之外 , 同步的调用播控任务调度 , 去更新缓存 。同步更新保证缓存数据的准确性 , 不会出现脏数据 , 异步更新保证更新链路的高可用 , 不会因为接口调用失败而导致缓存更新失败 , 达到最终数据的一致性 。
2) 缓存一致性检测
缓存冗余更新是用来确保写入缓存时数据的正确性 。除此之外 , 我们还提供一种写入缓存后的缓存一致性检测机制 , 专门检查近期写入缓存的数据是否符合预期 , 检测到不一致后进行上报和清理 。
检测流程如下 , 利用guava cache设置5s过期机制 , 在数据变更写入数据库和缓存的5s之后 , 通过监听器监听guava cache的过期 , 来触发数据对比的检测 , 并根据检测结果做出相应的处理 。
文章图片
文章图片
脏数据检测流程
4、远端/近端调用动态切换设计
播控除了通过RPC调用方式为上游业务提供基础服务 , 还提供了播控SDK可以供业务方进行近端调用 。近端调用对于业务方来说在降低延时 , 提高成功率方面都有很好的效果 , 对于播控来说也能减轻服务器压力 , 节省资源 。但为了防止出现稳定性问题 , 也必须面向失败设计 , 提供降级方案 , 其中一种降级方案是流量动态切换方案 。当业务方机器能够承受的SDK流量上限超过阈值时 , 多余的流量会动态分散到播控中心系统;这在实际中是很有效的 , 在一些单机QPS达到1000甚至更高的场景下 , 确保SDK不会压垮业务方机器 。极端情况下 , 所有流量都可以回切到播控中心系统 。
推荐阅读
- 苹果:iPhone12 CAD图纸意外曝光!全新外观设计
- 蚕豆■三星新无线耳机渲染图曝光:设计完全改版神似蚕豆搭配三款配色
- 【刘海】iPhone12基本确定,设计有亮点,可以和三星S20U说再见了
- 科技犬玩机:iPhone12基本确定,设计有亮点,可以和三星S20U说再见了
- 「ROM乐园TB」三星新无线耳机渲染图曝光:设计完全改版神似蚕豆搭配三款配色
- [牛科技]在智能手机领域失败的HTC,多年努力后又在全新领域做到世界第一
- ■新形势下传统企业破局重生林魔头教你从商业模式设计开始
- :iPhone12真机首次曝光,外观设计致敬乔布斯,性能有望全球第一
- 【】iPhone12 Pro Max设计细节曝光,刘海有望缩小
- 「并行」高速PCB设计必备知识:并行总线VS串行总线