當前位置:首頁>科技> CDN是什么?使用CDN有什么優勢?
發布時間:2026-01-17閱讀( 9)
淘寶的圖片訪問,有98%的流量都走了CDN緩存。只有2%會回源到源站,節省了大量的服務器資源。
但是,如果在用戶訪問高峰期,圖片內容大批量發生變化,大量用戶的訪問就會穿透cdn,對源站造成巨大的壓力。
結合阿里淘系2020年雙11的淘寶實踐,給大家分享下在圖片業務里,我們是如何使用CDN以及如何解決挑戰和困難。
內容分發網絡(Content Delivery Network,簡稱CDN)是建立并覆蓋在承載網之上,由分布在不同區域的邊緣節點服務器群組成的分布式網絡。#鼻屎#
CDN應用廣泛,支持多種行業、多種場景內容加速,例如:圖片小文件、大文件下載、視音頻點播、直播流媒體、全站加速、安全加速。

借用阿里云官網的例子,來簡單介紹CDN的工作原理。
假設通過CDN加速的域名為www.a.com,接入CDN網絡,開始使用加速服務后,當終端用戶(北京)發起HTTP請求時,處理流程如下:
從這個例子可以了解到:
(1)CDN的加速資源是跟域名綁定的。#濮陽闿是誰?他與東吳大臣濮陽興是什么關系?#(2)通過域名訪問資源,首先是通過DNS分查找離用戶最近的CDN節點(邊緣服務器)的IP(3)通過IP訪問實際資源時,如果CDN上并沒有緩存資源,則會到源站請求資源,并緩存到CDN節點上,這樣,用戶下一次訪問時,該CDN節點就會有對應資源的緩存了。
商品的主圖貫穿整個導購和交易鏈路,相比文字,圖片更能吸引眼球,主圖對消費者的購物決策有很大的影響。主圖上表達的內容各式各樣,但其中一定少不了的一定是價格的表達。
長期以來,主圖上的價格表達都是商家自己維護,商品價格發生變化后,手動去換圖。這樣做,會帶來3個問題: (1)價格的準確性:商家手動填寫的圖片價格,跟實際的購買價可能不一致,造成不好的用戶體驗。 (2)價格更新的及時性:有時候,由于優惠券/品類券的生效失效,會導致商品的價格變化會很頻繁,商家根本來不及換圖。 (3)商家的操作成本:手動修改圖片的價格,成本還是很高的,需要通過ps等軟件修改圖片,重新上傳,編輯商品。
今年雙11,我們淘寶鹿班團隊,試圖通過技術手段來解決這些問題。當商品價格發生變化后,系統自動計算新的價格,自動合成圖片,然后更新商品主圖。
我們知道,淘寶網有上億的商品,光大促商品就有幾千萬,因此,價格變化導致的圖片變化頻率非常高。最高的就是在雙11的0點,全部大促商品的價格都會由日常價格變成大促價格。
這就意味著,大促高峰期,有上千萬的圖片剛生成就會被用戶訪問。那這個情況會產生什么問題呢,讓我們先了解下淘寶的圖片空間和CDN的架構,就清楚了。
淘寶整個圖片的訪問鏈路有三級緩存(客戶端本地、CDN L1、CDN L2),所有圖片都持久化的存儲到OSS中。真正處理圖片的是img-picasso系統,它的功能比較復雜,包括從OSS讀取文件,對圖片尺寸進行縮放,編解碼,所以機器成本比較高。
CDN的緩存分成2級,合理的分配L1和L2的比例,一方面,可以通過一致性hash的手段,在同等資源的情況下,緩存更多內容,提升整體緩存命中率;另一方面,可以平衡計算和IO,充分利用不同配置的機器的能力。

用戶訪問圖片的過程如下:(1)用戶通過手機淘寶來搜索商品或者查看寶貝詳情。(2)詳情/搜索/推薦通過調用商品中心返回商品的圖片URL。(3)客戶端本地如果有該圖片的緩存,則直接渲染圖片,否則執行下一步。(4)從CDN L1回源圖片,如果L1有該圖片的緩存,則客戶端渲染圖片,同時緩存到本地,如果L1沒有緩存,則執行下一步。(5)從CDN L2回源圖片,如果L2有該圖片的緩存,則客戶端渲染圖片,同時CDN L1及客戶端緩存圖片內容,如果CDN L2沒有緩存該圖片,則執行下一步。(6)從圖片空間回源圖片,圖片空間會從OSS拉取圖片源文件,按要求進行尺寸縮放,然后執行編解碼,返回客戶端能夠支持的圖片內容,之后客戶端就可以渲染圖片,同時CDN的L1、L2以及客戶端都會緩存圖片內容。

當商品的價格發生變化時,我們會使用新的價格重新合成圖片,更新商品中心中存儲的圖片URL。
這樣會帶來2個問題:(1)CDN及手機淘寶原本緩存的圖片內容失效了,用戶訪問圖片會全部回源到img-picasso。(2)由于更改了商品的字段,交易的核心應用(購物車和商品中心)的緩存也失效了,用戶瀏覽及購物時,對商品的訪問會走到db。
源站img-picasso處理圖片,以及查詢商品DB,都是非常消耗資源的。CDN及商品的緩存命中率降低后,對源站img-picsasso以及db會產生巨大的壓力。
拿CDN緩存為例,簡單計算一下,CDN平時的命中率是98%,假設命中率降低1個點,對源站的壓力就會增加1/3(原本承擔2%的流量,現在需要承擔3%的流量),意味著img-picasso需要擴容1/3。如果全網一半的圖片都同時變化,cdn的命中率降到50%,對img-picasso的訪問量就會增加25倍,這個擴容成本肯定沒法接受。
解決這2個問題,對應的有2個辦法:(1)改圖保持圖片URL不變,可以避免商品鏈路的緩存失效。(2)在訪問高峰到來之前,提前預熱圖片到CDN,可以避免CDN緩存失效對源站的壓力。
下面,介紹下我們具體是怎么做到這2點的。
改圖保持圖片URL不變

圖片內容發生變化時,執行下面2個操作:(1)更新OSS內容:使用新的圖片內容替換OSS中老的圖片內容(2)刷新CDN緩存:清除CDN之前緩存的圖片內容
這樣,用戶再次訪問圖片時,發現CDN沒有緩存,就會回源到img-picasso,從OSS拉取新的圖片內容。
由于圖片URL沒有變化,就不必去更新商品中心的圖片鏈接,這樣商品鏈路的緩存可以保持不變。在真正實施這個方案的過程中,遇到了幾個問題,簡單跟大家分享下:
OSS三地同步
淘寶的圖片空間,承載了淘系所有圖片的上下行穩定性保障,為了保障高可用,一份資源會存儲到三地OSS。圖片上傳時,默認只上傳一地,利用OSS的能力,自動同步到另外兩地。
但是使用URL不變方案,CDN緩存已經清除完成后,如果另外2地的OSS還未同步完成,用戶訪問后,就會回源到舊的圖片內容,發現圖片內容沒有變化。
針對該問題,我們將異步同步OSS軟鏈的模式,改成三地同步建軟鏈,三地都返回成功后,再去清除CDN緩存,這就保證了用戶訪問的圖片一定是最新的內容。

圖片尺寸收斂
同一張商品圖片會用于不同的場景坑位展現,不同的坑位對圖片的尺寸有不同的要求。為此,圖片空間提供了一項功能,可以方便的生成不同尺寸的縮率圖。只需要訪問圖片時,給圖片增加不同的后綴,img-picasso源站就可以按要求進行圖片進行縮放。
由于歷史原因,之前對縮放的尺寸種類沒有限制,導致CDN上的圖片后綴格式多達2400種+,TOP6格式覆蓋率46%,TOP15格式覆蓋率64%。這意味著,一張圖片,在cdn上最多可能有2400+個不同的url,當圖片內容變化后,要把這些緩存全部清掉,才能保證所有用戶看到的圖片都是新內容。
為了解決這個問題,我們對域名格式進行了收斂。
圖片空間對于圖片質量壓縮參數的規則如下:* 圖片質量參數常見有一下8種形式:Q90、Q75、Q50、Q30、q90、q75、q50、q30* 圖片銳化參數常見有一下3種形式:s100,s150,s200
我們重新將圖片質量定義為高質量圖片和低質量圖片,收斂格式為 q90 和 p50s150這樣,就可以把2000多種格式收斂到6種主要格式,CDN清除緩存才變得可行。
多副本清除CDN緩存
通過圖片尺寸收斂,每張圖片只需要清除6個不同的url就可以了,那能不能進一步提升刷新效率呢?
為此,阿里云CDN為我們提供了多副本刷新的解決方案:每種不同后綴的圖片,作為圖片的一個副本,在CDN的swift層增加一層KV結構,存儲url和不同副本的映射關系,清除緩存時,可以通過該結構找到所有副本,實現快速清除所有副本。這樣,每張圖片,我們只需要調用一次CDN清除緩存接口就可以了,極大提升了CDN緩存刷新效率。

圖片域名收斂
淘系的圖片域名有300多種,主要有下面2個原因:(1)圖片完整的鏈接太長,所以存儲時經常只存最后一段,業務自己來拼域名,很多業務就自己申請了一個圖片域名來拼。(2)PC時代,瀏覽器對同一域名下的并發請求數是有限制的,不同瀏覽器不一樣,一般6個左右。
為了突破該限制,一些業務就會申請多個域名,隨機的拼不同的域名。
前面我們講過,CDN的緩存是跟域名綁定的,不管是緩存命中還是緩存清除,都只能針對一個域名。
我們顯然不可能改一張圖,就去對300個域名調用CDN刷新。于是我們考慮對圖片域名進行收斂,使得用戶對圖片的訪問都路由到同一個域名,我們希望將所有的圖片訪問統一收斂到http://picasso.alicdn.com,具體實現方式如下:
(1)對于手淘和貓客客戶端,圖片訪問都收口在圖片庫,我們推進圖片庫進行改造,符合一定規則的url,統一收斂到http://picasso.alicdn.com,實現了域名的一刀切。(2)對于PC瀏覽器端,就比較麻煩了,沒有統一收口的地方。我們只能退而求其次,針對訪問最多的6大域名,在cdn上配置域名轉發規則,重定向到picasso域名。

通過這種方式,我們實現了全網99%以上的圖片訪問流量都路由到picasso域名,圖片內容發生變化時,通過清除picasso域名的cdn緩存,就能保證基本所有的場景都能看到新的圖片內容。
通過多副本和圖片域名收斂,cdn的緩存問題得到了解決。但在cdn之上,用戶圖片訪問首先是來自客戶端或者瀏覽器,這里也會有一層緩存。
大家知道,瀏覽器的緩存都遵循標準的http max-age協議,指定該header后,到了時間圖片就會失效,訪問到新的圖片。所以我們可以在源站img-picasso回源給cdn時,添加max-age協議頭,值為1分鐘,cdn會原封不動的透給瀏覽器,這樣瀏覽器就可以實現1分鐘內圖片緩存失效,重新到cdn拉新的圖片資源。
對于手機淘寶客戶端,我們在原有的LRU緩存機制之上,另外支持標準的http協議。這樣,手機淘寶也實現了1分鐘內圖片緩存失效。
提前預熱CDN圖片
通過改圖保持圖片URL不變,我們解決了改圖對商品鏈路緩存的影響。但是,圖片變化時,雖然URL沒有變,但我們清除了CDN緩存,導致用戶訪問時還是會回源到img-picasso源站,所以對圖片源站的壓力依然存在。

我們發現,商品的價格變化大部分發生在大促節奏變化的時刻,基于這個特點,我們通過提前合成圖片,提前預熱到CDN,可以實現圖片切換瞬間生效,同時對源站沒有壓力。
具體方案如下:(1)提前合成多波段圖片:我們知道大促期間商家集中換圖的時間點后,按這些時間點把圖片的展示分成多個波段,每個波段圖片提前合成,并提前將圖片URL寫入到商品中心擴展結構中。(2)圖片訪問路由:營銷系統根據配置的大促氛圍切換計劃,告訴鹿班圖片二方包,當前是哪個波段,鹿班根據當前波段及場景,返回正確的圖片URL給各個場景。(3)圖片渲染:各個場景拿到圖片URL后,結合自身的業務邏輯,決定是否要展現該圖片。(4)CDN圖片預熱:為了避免圖片集中切換時,把源站擊垮,我們會在集中切換前把這些冷圖片內容預熱到CDN。(5)波段內圖片變化:提前合成各個波段圖片后,商家可能會臨時發券/改價,導致商品價格再次變化,對于這類換圖需求,為了避免更新商品中心的圖片URL,我們通過本文上一章節刷CDN緩存的方式實現。
CDN技術廣泛應用于互聯網的各個場景,如今的CDN服務商,都提供了非常簡單的業務接入方式,而且CDN的費用每年都在降低,這一切使得CDN的接入和使用成本越來越低。
本文通過淘寶圖片業務的例子,為大家闡述了使用CDN過程中可能遇到的問題和解決思路。
淘寶的圖片業務除了訪問量大,還會面臨更新頻繁的問題。圖片的頻繁更新,一方面會由于商品上的圖片url變化,導致商品緩存失效,另一方面會大幅降低CDN的圖片訪問緩存命中率。
針對圖片url變化導致商品緩存失效的問題,我們通過刷新cdn緩存,用戶訪問時重新回源的方式,實現了改圖保持圖片url不變,這個過程中了,我們解決了一些列的問題,包括:OSS三地同步更新、圖片尺寸收斂、圖片域名收斂、客戶端及瀏覽器本地緩存。
針對改圖降低CDN圖片緩存命中率的問題,我們根據業務的特點,提前合成不同波段的圖片,并預熱到CDN,保障了源站的安全。目前,淘寶上用戶看到的圖片,都是提前合成好的。未來,我們考慮在用戶訪問圖片時,實時合成圖片。通過這項技術,可以實時感知業務更多的實時信息,可以根據這些信息,在圖片上合成當前用戶或者環境更匹配的文案/元素等內容,給用戶帶來更多的驚喜。
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖