IM系統如何提高用戶發送、瀏覽圖片和音視頻消息的體驗呢?一是保證圖片、音視頻消息發送得又快又穩,二是保證用戶瀏覽播放圖片、音視頻消息時流暢不卡頓。
算法
針對不一樣的主流運營商提供不一樣的上傳接入點 IP,而後經過運營商 DNS 解析,讓用戶能經過本運營商的上傳接入點來快速上傳圖片和視頻;後端的圖片上傳存儲服務也能夠部署在多線機房,這樣上傳服務也能快速地把文件流提交給存儲層,從而避免從接入點到存儲服務的跨網開銷,也能解決其餘運營商的用戶下載圖片時須要跨網的問題。後端
對於擁有多機房的公司,也能夠只把上傳存儲服務部署在單線機房,而後再經過專線解決多個單線機房之間的訪問。緩存
把多媒體消息上傳通道和普通消息收發通道獨立開。安全
發送圖片、視頻這樣的多媒體消息時,先經過獨立通道上傳文件流,上傳完成後會返回文件的惟一標識 ID,而後再把這個惟一標識 ID 做爲消息的引用,經過普通消息收發通道進行發送。性能優化
對於語音這樣的消息,經過普通消息收發的長連通道來分片上傳語音流,更方便經過長連來下推給接收方,避免用戶在播放語音時須要從遠程臨時下載文件,使用流暢度會更好。服務器
不用多說,咱們都知道 CDN 的做用是讓資源離用戶更近。併發
CDN 加速主要採起「拉模式」的策略。客戶端上傳的圖片、音視頻發佈到多個分佈在各地的 CDN 節點的服務器上,當有用戶須要訪問這些圖片和音視頻時,可以經過 DNS 負載均衡技術,根據用戶來源就近訪問 CDN 節點中緩存的圖片和音視頻消息,若是 CDN 節點中沒有須要的資源,會先從源站同步到當前節點上,再返回給用戶。負載均衡
在上面提到:若是 CDN 節點中沒有須要的資源,會先從源站同步到當前節點上,再返回給用戶。但若是是超高熱度的大型聊天室,可能用戶就近訪問的節點沒有須要的資源,則高併發的請求都被回源到源站,會對源站的帶寬和存儲帶來很大的壓力。高併發
針對這個問題,能夠採用「預熱」的方式,來提早強制 CDN 節點回源並獲取最新文件,減輕源站的壓力,提升資源的訪問效率。性能
圖片
好比服務器對圖片生成幾種常見的低分辨率縮略圖,用戶點開時,根據終端的分辨率按需下載,「查看原圖」時再去加載大圖,這樣能夠提高加載速度。
將上傳的圖片轉爲 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 視頻的覆蓋度。
藉助即時消息自身的「長鏈接」通道,將音頻流、圖片或視頻的縮略圖推送下去,這樣就不會由於須要臨時從服務端獲取而出現卡頓了,減小加載耗時,提高用戶體驗。
用戶經過上傳服務,把視頻上傳到服務端;服務端進行視頻的 HLS 切片並針對切完的 TS 文件流進行加密,同時把密鑰存儲到密鑰服務中。
當有用戶請求該視頻時,CDN 節點從源站回源加密的視頻文件,播放器先經過下載的 M3U8 索引文件獲取到「密鑰地址」。
客戶端緩存的認證 Token 拼接到該「密鑰地址」後面,再經過該地址請求鑑權服務,鑑權服務檢查攜帶的認證 Token 是否有權限訪問該視頻文件。
若是權限沒問題,會從密鑰存儲服務中將該視頻的密鑰文件返回給播放器,這時播放器就能自動解密播放了。
HLS 僅支持視頻的加解密操做,不支持圖片等其餘格式的資源。針對其餘格式的資源,能夠採用「時間戳防盜鏈」的方案。
Token防盜鏈經過對時間有關的字符串進行簽名,將時間,簽名信息經過必定的方式傳遞給CDN節點服務器做爲判斷依據,CDN 節點則會根據 URL 的加密形式,取出對應的過時時間,和當前服務器時間進行比較,確認請求是否過時,過時的話,則直接拒絕;若是時間未過時,CDN 節點將根據約定的簽名算法和密文,計算後的值和 URL 中的原始加密串進行比較;經過以後,請求會被認爲是合法的。不合法的請求能夠採起禁止訪問或其餘操做。