《即时消息技术剖析与实战》学习笔记12——IM系统如何提升图片、音视频消息发送、浏览的体验
IM系统如何提升用户发送、浏览图片和音视频消息的体验呢?一是保证图片、音视频消息发送得又快又稳,二是保证用户浏览播放图片、音视频消息时流畅不卡顿。
一、提升用户发送图片、音视频的体验
1. 多上传接入点
针对不同的主流运营商提供不同的上传接入点 IP,然后通过运营商 DNS 解析,让用户能通过本运营商的上传接入点来快速上传图片和视频;后端的图片上传存储服务也可以部署在多线机房,这样上传服务也能快速地把文件流提交给存储层,从而避免从接入点到存储服务的跨网开销,也能解决其他运营商的用户下载图片时需要跨网的问题。
对于拥有多机房的公司,也可以只把上传存储服务部署在单线机房,然后再通过专线解决多个单线机房之间的访问。
2. 上传链路优化
把多媒体消息上传通道和普通消息收发通道独立开。
- 图片、视频
发送图片、视频这样的多媒体消息时,先通过独立通道上传文件流,上传完成后会返回文件的唯一标识 ID,然后再把这个唯一标识 ID 作为消息的引用,通过普通消息收发通道进行发送。
- 语音
对于语音这样的消息,通过普通消息收发的长连通道来分片上传语音流,更方便通过长连来下推给接收方,避免用户在播放语音时需要从远程临时下载文件,使用流畅度会更好。
3. 分片上传、断点续传和秒传
二、提升用户浏览图片、播放视频的体验
1. CDN 加速
不用多说,我们都知道 CDN 的作用是让资源离用户更近。
- CDN 加速
CDN 加速主要采取“拉模式”的策略。客户端上传的图片、音视频发布到多个分布在各地的 CDN 节点的服务器上,当有用户需要访问这些图片和音视频时,能够通过 DNS 负载均衡技术,根据用户来源就近访问 CDN 节点中缓存的图片和音视频消息,如果 CDN 节点中没有需要的资源,会先从源站同步到当前节点上,再返回给用户。
- CDN 预热
在上面提到:如果 CDN 节点中没有需要的资源,会先从源站同步到当前节点上,再返回给用户。但如果是超高热度的大型聊天室,可能用户就近访问的节点没有需要的资源,则高并发的请求都被回源到源站,会对源站的带宽和存储带来很大的压力。
针对这个问题,可以采用“预热”的方式,来提前强制 CDN 节点回源并获取最新文件,减轻源站的压力,提高资源的访问效率。
2. 下载性能优化
图片
- 分辨率自适应
比如服务器对图片生成几种常见的低分辨率缩略图,用户点开时,根据终端的分辨率按需下载,“查看原图”时再去加载大图,这样可以提升加载速度。
- 格式优化
将上传的图片转为 WebP 或渐进式 JPEG 格式。
前者可以在保持相同质量的前提下,比同样的 PNG 或 JPEG 图片小 30% 左右,但在 iOS 系统上的支持性不太好,需要一定的开发成本;
后者能够在加载图像时提供低分辨率的“预览”,节省数据流量,提升图像加载速度,加载体验更好,但渐进式 JPEG 编码比传统基线 JPEG 的编码速度慢了 60%,需要权衡性能和成本的平衡。
视频
- 边下边播
在播放器下载完视频的格式信息、关键帧等信息后,播放器就可以开始播放,同时结合 HTTP 协议自带支持的 Range 头按需分片获取后续的视频流,从而来实现边下边播和拖动快进。
边下边播需要服务端支持 Range 分片获取。
- 视频预加载
对视频流进行“部分提前加载”,也就是所谓的“秒开”,可以提升用户的体验。
预加载可以按时间或者大小来限制。比如,我们可以设定预加载 3s 的视频流,或者设定预加载 512KB 的视频流。
- 视频转码
主流的视频格式采用 H.264 编码,H.265 是 2013 年新制定的视频编码标准。同样的画质和同样的码率,H.265 比 H.264 占用的存储空间要少 50%,但编码复杂度远高于 H.264(10 倍左右)。
因此在实现时,只选取部分热点视频来进行 H.265 编码,降低转码开销的同时来尽量提升 H.265 视频的覆盖度。
3. 推流
借助即时消息自身的“长连接”通道,将音频流、图片或视频的缩略图推送下去,这样就不会因为需要临时从服务端获取而出现卡顿了,减少加载耗时,提升用户体验。
三、保障用户发送图片、音视频的安全性
1. CDN文件访问鉴权
用户通过上传服务,把视频上传到服务端;服务端进行视频的 HLS 切片并针对切完的 TS 文件流进行加密,同时把密钥存储到密钥服务中。
当有用户请求该视频时,CDN 节点从源站回源加密的视频文件,播放器先通过下载的 M3U8 索引文件获取到“密钥地址”。
客户端缓存的认证 Token 拼接到该“密钥地址”后面,再通过该地址请求鉴权服务,鉴权服务检查携带的认证 Token 是否有权限访问该视频文件。
如果权限没问题,会从密钥存储服务中将该视频的密钥文件返回给播放器,这时播放器就能自动解密播放了。
2. 时间戳防盗链
HLS 仅支持视频的加解密操作,不支持图片等其他格式的资源。针对其他格式的资源,可以采用“时间戳防盗链”的方案。
Token防盗链通过对时间有关的字符串进行签名,将时间,签名信息通过一定的方式传递给CDN节点服务器作为判断依据,CDN 节点则会根据 URL 的加密形式,取出对应的过期时间,和当前服务器时间进行比较,确认请求是否过期,过期的话,则直接拒绝;如果时间未过期,CDN 节点将根据约定的签名算法和密文,计算后的值和 URL 中的原始加密串进行比较;通过之后,请求会被认为是合法的。不合法的请求可以采取禁止访问或其他操作。
《即时消息技术剖析与实战》学习笔记12——IM系统如何提升图片、音视频消息发送、浏览的体验的更多相关文章
- 《即时消息技术剖析与实战》学习笔记4——IM系统如何保证消息的可靠性
IM 系统中,保证消息的可靠投递主要体现在两方面,一是消息的不丢失,二是消息的不重复. 一.消息不丢失 消息丢失的原因 首先看一下发送消息的流程,如下图所示: 消息.可以采取"时间戳比对&q ...
- 《即时消息技术剖析与实战》学习笔记5——IM系统如何保证消息的一致性
一.什么是消息一致性 消息一致性指的是消息的时序一致性,即消息收发的一致性.如果不能保证时序一致性,就会造成聊天语义不连贯,引起误会. 对于点对点的聊天场景,时序一致性保证接收方的接收顺序和发送方的发 ...
- 《即时消息技术剖析与实战》学习笔记1——IM系统的架构
一.IM的应用场景 聊天.直播.在线客服.物联网等所有需要实时互动.高实时性的场景,都需要应用到 IM 技术.
- 《即时消息技术剖析与实战》学习笔记6——IM系统如何保证消息的安全性
在消息产生.流转的各个环节中,需要保证消息传输安全性.消息存储安全性.消息内容安全性. 一.消息传输安全性 消息传输的重要防范点有两个,一是访问入口安全,二是传输链路安全. 1.HttpDNS保证访问 ...
- 《即时消息技术剖析与实战》学习笔记11——IM系统如何保证服务高可用:流量控制和熔断机制
IM 系统的不可用主要有以下两个原因: 一是无法预测突发流量,即使进行了服务拆分.自动扩容,但流量增长过快时,服务已经不可用了: 二是业务中依赖的这些接口.资源不可用或变慢时,比如发消息可能需要依赖& ...
- 《即时消息技术剖析与实战》学习笔记3——IM系统如何保证消息的实时性
IM 技术经历过几次迭代升级,如图所示: 从简单.低效的短轮询逐步升级到相对效率可控的长轮询: 全双工的 Websocket 彻底解决了服务端的推送问题: 基于 TCP 长连接衍生的 IM 协议,能够 ...
- 《即时消息技术剖析与实战》学习笔记7——IM系统的消息未读
一.什么是消息未读 消息未读包括会话未读和总未读.前者指的是当前用户和某一聊天方的未读消息数,后者指的是当前用户的所有未读消息数,也就是所有会话未读的和.比如用户A收到用户B的2条消息,还收到用户C的 ...
- 《即时消息技术剖析与实战》学习笔记8——IM系统如何保证长连接的可用性:心跳机制
假设有以下突发意外情况: 用户进入信号不好的地方,手机没有网络信号了 上网的路由器突然掉线了 这个时候,比如微信发消息,消息就会转圈圈,甚至变成红色叹号-- 上面情况都会导致"长连接&quo ...
- 《即时消息技术剖析与实战》学习笔记9——IM系统如何支持消息的多终端漫游
一.什么是多终端漫游 多终端漫游是指:用户在任意一个设备登录后,都能获取到历史的聊天记录.如:QQ 默认漫游 7 天的聊天记录,开通 VIP 会员可漫游 30 天,开通 SVIP 会员可漫游 2 年. ...
随机推荐
- 吴裕雄--天生自然 HADOOP大数据分布式处理:安装配置MYSQL数据库
安装之前先安装基本环境:yum install -y perl perl-Module-Build net-tools autoconf libaio numactl-libs # 下载mysql源安 ...
- LeetCode No.70,71,72
No.70 ClimbStairs 爬楼梯 题目 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. ...
- Euler characteristic
Euler characteristic Euler定理 顶点(v),棱数(edge)(e),面(J) 尽管我们有四个不同的四面体,但是如果我们将顶点数\((v)\)减去棱数\((e)\)再加上四面体 ...
- Introduction to Computer Science and Programming in Python--MIT
学习总结--(Introduction to Computer Science and Programming in Python--MIT) 导论 主题 重新利用数据结构来表达知识 理解算法的复杂性 ...
- [SDOI2006] 线性方程组
洛谷 P2455 传送门 刚开始写了个消成上三角的,结果狂wa. 后来经过研究发现,消成上三角那种不能直接判断无解或无穷多解,需要其它的操作. 所以干脆学了个消成对角线的,写了一发A了. 其实两种消元 ...
- 2015-09-14-C++基础
声明与定义 声音与定义的区别在于,声明没有给变量分配空间,而定义则给变量分配了空间:定义也是声明. extern int i; // 声明但未定义 int i ; //声明且定义 extern dou ...
- drf三大认证
源码分析 """ 1)APIView的dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial( ...
- 吴裕雄--天生自然HTML学习笔记:启动TOMCAT服务器时出现乱码解决方法
- POJ 3249 Test for Job(拓扑排序+dp优化空间)
Description Mr.Dog was fired by his company. In order to support his family, he must find a new job ...
- 数据库中慎用float数据类型(转载)
数据库中慎用float数据类型 大多数编程语言都支持float或者double的数据类型.而数据库中也有相同关键字的数据类型,因此很多开发人员也自然而然地在需要浮点数的地方使用float作为字段类 ...