小结:

1、服务熔断策略

在网关服务中经常会对后端不同api接口做服务聚合,比如A服务 -> B服务 -> C服务 ,如果C服务出现问题,那么在调用C服务之前需要做熔断。而在设计熔断器的时候主要实现了以下三个状态:

状态

具体策略

Closed

熔断器关闭状态,如果服务调用失败,则使失败次数加1,失败次数到了一定阈值或者一定比例,则启动熔断机制。

Open

熔断器打开状态,在该状态下会对出错的服务请求立即返回错误响应,同时设计了一个时钟选项,默认的时钟达到了一定时间(这个时间一般设置成平均故障处理时间,也就是MTTR),到了这个时间,进入半熔断状态。

Half-Open

允许定量的服务请求,如果调用在一定比例上都成功了则认为已恢复,关闭熔断器(重置失败次数),否则打开熔断器。

2、提高单机并发承载能力

一级缓存local cache+二级分布式缓存Redis

解决数据一致性的问题:

利用Redis Pub/Sub(发布/订阅)的特性以及设计合理的Redis key 来避免以上问题。
每个业务机上有个后台线程订阅redis消息,如果计算中心更新Redis成功会publish消息,后台线程收到Redis的消息会更新当前本地缓存,保证每次更新数据时用户看到的数据都是相同的。

https://mp.weixin.qq.com/s/qts9huG0V91AfhRN4cts0Q

干货|爱奇艺直播 - 春晚直播业务API架构

原创: 爱奇艺直播团队 爱奇艺技术产品团队 3月15日

导读

家人团聚共赏春晚,已经成为国人欢度春节必不可少的庆祝方式。如今,爱奇艺春晚直播,成为千千万万家庭同享这份欢乐的新途径。根据以往的统计数据,春晚期间爱奇艺的访问量是平时的数倍甚至是数十倍,不亚于12306春节抢票的“盛况”,这也给系统带来了前所未有的访问压力。我们在2019年直播中加入了个性化节目和互动元素,接口复杂度更高,团队重点任务则是保障直播间信息、直播互动等后端直播内容流畅响应。除了春晚直播,像明星演唱会、综艺节目等大型直播也是我们重点服务对象。简而言之我们团队提供的是大型直播业务API服务,我们简称“QLive”。

大型直播往往带来的就是大流量和高并发,而我们的“QLive”也经受住了多次业务洪峰的洗礼和考验,下面是我们团队经历过的一些大型直播。

在春晚这种高并发的场景下,对“QLive”伸缩扩容和高可用具有较高的要求。而在互联网分布式架构设计中,为了提高系统并发能力主要有两种方法论:

方法/实施策略/优点/缺点

垂直扩展/提升单机并发处理能力/节省机器采购成本/单机性能有极限

水平拓展/增加对应业务机或者存储的服务器数量/机器资源足够的话能线性提升并发能力/有一定的机器采购成本

我们综合考虑了这两种方法,设计了多级缓存策略提升接口响应速度同时也提高了单机承载并发的上限,在应用层部署了双机房从而线性增加了整个服务的并发承载能力。经过线上压测,“QLive”目前承载40万+的qps。

接下来具体看下“QLive”的整体架构,整体上分成三层:

1. 接入层(业务中台)

主要扮演的角色是负载均衡、降级、业务封装、避免复杂性扩散,而且考虑到接入层位置的特殊性(物理上最接近用户),我们部署了外网多机房,主要有以下两个明显的作用:

·  让不同运营商的用户以最短路径接入系统。

·  避免由于部分主干网络故障导致的单点故障。

2.应用层(双机房架构):

实现了机房隔离、服务隔离、热点隔离等策略,提高了集群可用性和水平扩展的灵活性。

3.基础服务层:

运维平台

·  监控报警:通过分钟级报警感知、多维度监控图表做到业务提前预警和故障快速定位。

·  CMDB:资源管理、依赖管理、流程规范。

·  发布系统:管理代码上线、审计、回滚等功能。

数据中心

·  计算中心:基于Quartz的分布式任务调度系统,异步处理数据量大或者耗时长的业务。

·  Trace链路日志:Agent无侵入式部署、快速定位代码性能问题、可追溯的性能数据。

·  数据中心:前端PingBack、收集外网用户故障形成闭环、实时生成数据报表。

接入层—业务中台

接入层主要有两部分组成:网关服务、业务中台。为了防止系统过载,在接入网关服务中加入了熔断降级的策略,保证在极端情况下部分核心服务是可用的。

首先我们需要明确熔断和降级这两种概念:服务熔断一般是某个下游服务故障引起的;服务降级是整体服务压力过大需要保护核心业务采取的一些降级策略。

服务熔断:

在网关服务中经常会对后端不同api接口做服务聚合,比如A服务 -> B服务 -> C服务 ,如果C服务出现问题,那么在调用C服务之前需要做熔断。而在设计熔断器的时候主要实现了以下三个状态:

状态

具体策略

Closed

熔断器关闭状态,如果服务调用失败,则使失败次数加1,失败次数到了一定阈值或者一定比例,则启动熔断机制。

Open

熔断器打开状态,在该状态下会对出错的服务请求立即返回错误响应,同时设计了一个时钟选项,默认的时钟达到了一定时间(这个时间一般设置成平均故障处理时间,也就是MTTR),到了这个时间,进入半熔断状态。

Half-Open

允许定量的服务请求,如果调用在一定比例上都成功了则认为已恢复,关闭熔断器(重置失败次数),否则打开熔断器。

服务降级:

我们主要使用了自动开关降级、人工开关降级这两种策略。

·  自动开关降级:根据系统负载、整体超时率、失败次数等指标选择对次要功能(比如视频播放次数)做降级,降级后的处理方案有返回默认值、兜底数据、缓存等方案。

·  人工开关降级:通过监控报警发现线上一些服务存在问题,这个时候需要暂时将有问题的服务摘掉,比如某个缓存节点异常读取不到数据 ;如果发现某些写的服务调用量太大,如果不是强实时性,同步写的方式可以改成异步缓解存储压力。

应用层—双机房架构

双机房的主要技术挑战是机房间的延时、数据同步的问题。

1.机房延时问题:A城市的两个核心机房延时大概在1ms内,但是A城市到B城市则可能有近30ms的延时,如果应用依赖的服务都跨机房访问那么性能会惨不忍睹。

2.数据同步问题:如果MySQL、Redis等数据存储需要做不同机房的数据同步,如果有几十毫秒的延时,整个数据同步是非常大的挑战。

3.解决方案:

·  同城机房部署,机房延时可以忽略不计。

·  机房隔离,服务和服务之间,服务和资源之间使用智能DNS连接,尽量保证服务不跨机房调用。

应用层—多级缓存

为了提高单机并发承载能力,我们设计了多级缓存架构,最终线上服务端核心接口平均响应耗时在10ms内。

·  主要技术挑战:不同缓存之间数据一致性问题。

·  缓存中间件:一级缓存local cache+二级分布式缓存Redis。

·  解决数据一致性的问题:利用Redis Pub/Sub(发布/订阅)的特性以及设计合理的Redis key 来避免以上问题。每个业务机上有个后台线程订阅redis消息,如果计算中心更新Redis成功会publish消息,后台线程收到Redis的消息会更新当前本地缓存,保证每次更新数据时用户看到的数据都是相同的。

·  代理层缓存:用户访问量很多时候是无法预期的,机器数量不变的情况下,如何性能最大化是我们经常思考的问题。上图可以看出主要并发压力来自业务WebServer,直播节目有个特性,直播节目信息、流地址不会发生变化,通常只有在开播状态变更和直播结束时间延后会更改直播信息。在实际实践过程中发现,可以将核心节目接口功能上移到Nginx层,只有在配置中心加入缓存头的节目才会进行动态文件的缓存,保证缓存量控制极少的量,这样可以利用Nginx缓存文件优势,结合自身业务系统的特点,让静态缓存的灵活性和效率都能得到保障。

基础服务层—监控大屏

监控大屏主要分数据采集和图表展示,数据采集流程如下:

·  flume Agent收集采集Nginx的访问日志。

·  多个Agent数据汇聚到同一个Agent。

·  Kafka作为消息通道将数据存储到Hive。

·  通过大数据平台(babel)将不同纬度的数据汇总到业务mysql数据库中。

·  监控大屏最终展示汇总数据。

展望

以上是爱奇艺直播团队在大型直播场景下应对大流量高并发的一些思考,整个系统也经过了多次大型直播的考验,始终保持在低故障率,可用性做到了99.9999%。除了应对高流量,如何降低访问链路、加快业务方对接、直播组件化也是目前探索的方向。

爱奇艺直播 - 春晚直播业务API架构的更多相关文章

  1. 爱奇艺2018春招Java工程师编程题题解

    字典序最大子序列 题目描述 对于字符串a和b,如果移除字符串a中的一些字母(可以全部移除,也可以一个都不移除)就能够得到字符串b我们就称b是a的子序列. 例如."heo"是&quo ...

  2. 从B站、爱奇艺、映客的IPO上市,看国内视频公司的内容审核现状

    本文由  网易云发布. 3月30日,中央电视台<经济半小时>栏目讲述了网络上的一个顽症——色情内容.在这期主题为<互联网上的“色诱”>的节目中,央视的记者揭示了色情直播的猖獗. ...

  3. 从字节跳动离职后,拿到探探、趣头条、爱奇艺、小红书、15家公司的 offer【转】

    前言 博主目前从事Android开发3年,前两年一直在抖音工作.我这篇文章并不是简单的描述一些面试中的题,或者总结一些Android的知识,而是想记录我整个的想法和准备的过程,以及一些心得体会,让大家 ...

  4. 爱奇艺|B站|优酷|腾讯视频高清无水印视频下载方法(软件工具教程)

    导读:经常在大型视频网站平台上看到一些很价值和视频,希望能高清无水印下载到本地学习观看,今天小程序定制开发代码哥DaiMaGe6给大家分享一招免费下载全网高清无水印视频的方法. 高清无水印视频下载工具 ...

  5. 爱奇艺技术分享:爱奇艺Android客户端启动速度优化实践总结

    本文由爱奇艺技术团队原创分享,原题<爱奇艺Android客户端启动优化与分析>. 1.引言 互联网领域里有个八秒定律,如果网页打开时间超过8秒,便会有超过70%的用户放弃等待,对Andro ...

  6. 干货|爱奇艺CDN巡检系统技术解析

    小结: 1. 中心处理系统 /1/将定制后的巡检任务拆分,通过配置与任务分发系统.CMDB*( configuration management database)将派发到边缘拨测系统/2/处理边缘拨 ...

  7. 爱奇艺面试Python,竟然挂在第5轮……

    今天给大家分享我曾经在爱奇艺的面试,过程还是比较有意思的,可以给大家一些参考 聊骚阶段 嗲妹妹:你好,我是爱奇艺的HR,我们正在招聘运维开发岗位,请问您最近有在看工作机会吗? 我:(这声音也太酥了吧我 ...

  8. 爱奇艺面试Python,竟然挂在第5轮…(转)

    今天给大家分享我曾经在爱奇艺的面试,过程还是比较有意思的,可以给大家一些参考 聊骚阶段 嗲妹妹:你好,我是爱奇艺的HR,我们正在招聘运维开发岗位,请问您最近有在看工作机会吗? 我:(这声音也太酥了吧我 ...

  9. 得到、微信、美团、爱奇艺APP组件化架构实践

    一.背景 随着项目逐渐扩展,业务功能越来越多,代码量越来越多,开发人员数量也越来越多.此过程中,你是否有过以下烦恼? 项目模块多且复杂,编译一次要5分钟甚至10分钟?太慢不能忍? 改了一行代码 或只调 ...

随机推荐

  1. 【洛谷P2660烤鸡】

    题目背景 猪猪hanke得到了一只鸡 题目描述 猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末.孜然等),每种配料可以放1—3克, ...

  2. Lua中字符串库中的几个重点函数

    [前言] 在<Lua中的一些库(1)>中也说到了,要对string库的模式匹配进行单独的讲解.对于字符串的处理,对于任何语言的学习来说,都是一个难点,而且也是一个必会的知识点.给你一个字符 ...

  3. CKEditor5 + vue2.0 自定义图片上传、highlight、字体等用法

    因业务需求,要在 vue2.0 的项目里使用富文本编辑器,经过调研多个编辑器,CKEditor5 支持 vue,遂采用.因 CKEditor5 文档比较少,此处记录下引用和一些基本用法. CKEdit ...

  4. Python-form表单标签

    语义:标记表单 #1.什么是表单? 表单就是专门用来接收用户输入或采集用户信息的 #2.表单的格式 <form> <表单元素> </form> 链接:https:/ ...

  5. 25)django-form使用

    目录 1)django form作用 2)django form使用 一:django form 作用 django form有两个作用:一是用户输入数据验证:二是生成html 1)用户输入数据验证, ...

  6. 【MySql】update用法

    update 语句可用来修改表中的数据, 简单来说基本的使用形式为: update 表名称 set 列名称=新值 where 更新条件; 以下是在表 students 中的实例: 将 id 为 5 的 ...

  7. 爬虫高性能 asyncio库 twisted库 tornado库

    一 背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个结束后才能继续下一个,效率会非常低. 需要强调的是 ...

  8. 网络流24题——分配问题 luogu 4014

    题目链接:这里 本题是一个典型的费用流问题,可以作为费用流建图模板使用 首先看到,每个人只能做一件工作,每件工作只能做一次,一个人做某件工作有一定的收益 那么我们建立一个超级源点st和超级终点ed,然 ...

  9. bzoj 3277

    十分之恶心的后缀自动机 (其实是水题,但是我太弱了...) 首先,有一个预备知识:bzoj 2780https://blog.csdn.net/lleozhang/article/details/89 ...

  10. Android人脸检测1(静态图片)

    搭建Android人脸识别环境花了很长时间(可以查看之前的文章),解决Android开发中的杂七杂八小问题也耗时不少. 今天记录一下,点击选择照片或者拍照上传照片进行人脸检测的小demo. (andr ...