《即时消息技术剖析与实战》学习笔记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 年. ...
随机推荐
- Docker 安装 CentOS
Docker 安装 CentOS CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise ...
- jquery mobile AJAX特性的陷阱
简单情况是 MVC 重定向,URL不变 试了N种方式,跳来跳去,无解,服务端跳,写JS跳,生成跳转中间页跳.失败 后来一看,明明已经跳到新页了,样式什么还是原页的,有点火大了. 出去溜一圈,喝杯水,和 ...
- 转: zabbix对cisco2960的监控
转自:http://blog.chinaunix.net/uid-12115233-id-3561954.html 1:首先在官网下载Cisco2950 模板https://www.zabbix.co ...
- 《JavaScript算法》二分查找的思路与代码实现
二分查找的思路 首先,从有序数组的中间的元素开始搜索,如果该元素正好是目标元素(即要查找的元素),则搜索过程结束,否则进行下一步. 如果目标元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半 ...
- SWUST OJ 爬不出去的水井(0333)
爬不出去的水井(0333) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 1069 Accepted: 150 Descriptio ...
- pipe 导致的 CLOSE_WAIT :: Utop's Blog
历时一周总算把导致服务大量 CLOSE_WAIT 的原因给找到了.打印任务调用栈果然的必备手段啊! 问题描述 Python 服务 A,用于接收心跳包确认其他服务是否存活.其他服务每 5 分钟向 A 发 ...
- Linux上SVN安装
SVN,Subversion,是一个开源的版本控制系统. svn有两种运行方式:独立的服务器和借助apache运行,各有利弊.
- 关于sql拼接的知识点 where1=1
String sql="select * from tab_route where 1 = 1 "; 这样不会报错,而且可以根据情况,再去拼接sql 可以使用if(){}else{ ...
- Python实现链表倒序(带头指针)
class ListNode(object): def __init__(self, x): self.val = x self.next = None def reverseList(self, h ...
- 前进中的人工智能——聚焦Faculty Summit 2015人工智能主题研讨会
Summit 2015人工智能主题研讨会" title="前进中的人工智能--聚焦Faculty Summit 2015人工智能主题研讨会"> 在近几年上映的科幻大 ...