支撐瞬間百萬 QPS 的熱點文章服務的設計

    在我們的日常生活中,總是在一個不經意間就會出現一個大新聞,如某某一線明星出軌、某某明星官宣結婚、某某明星偷稅漏稅等等。這個都是我們粉絲或者喫瓜羣衆感興趣的話題,一旦新聞被爆出之後,新聞平臺(如微博、頭條、騰訊新聞)都會在短時間內出現某個新聞點擊量暴增,如果沒有做好系統的應對措施就會出現短時間的大流量打垮平臺服務器。

    針對熱點新聞的短時間大流量的請求,我們需要做相應的架構設計來支撐服務。

1、技術點——FreeMarker

    FreeMarker 是一款模板引擎,即一種基於模板和要改變的數據, 並用來生成輸出文本 (如 HTML 網頁)的通用工具。它是一個 Java 類庫,程序員可以嵌入他們所開發產品的組件。

 FreeMarker 和 SpringBoot 整合是很簡單,這裏就不在詳細介紹了。

2、文章服務的設計

下圖是我們從網上截取的文章

我們可以發現文章具有如下的特點:

(1)文章一般都是由文字和圖片或者視頻等組成的,可以理解成有固定的格式。

(2)文章一旦被髮布之後,其內容是不可以再被修改的。

    針對以上的特點,爲了應對突增的流量,我們可以將文章內容使用 FreeMarker 模版引擎預先生成 HTML 文件,這樣的優勢在於客戶端直接讀取 html 文件並將文章內容展示出來,此時無需服務端或者客戶端做數據查詢和組裝的工作,大大的提升了系統的性能。如下生成 HTML 文件的過程:

(1)文章內容預先使用 FreeMarker 生成 HTML 文件並上傳到雲服務器上。

(2)雲服務器返回文件的地址給調用方。

(3)調用方接收到雲服務器的文件存儲地址後保存到文章服務的 Mysql、緩存一份文章信息(包括文章的 id、文章的文件地址 URL)到 redis 中、發送一個文章數據到 MQ 中(用戶廣播數據到本地緩存中)

3、整體服務的設計

(1)運營人員發送熱點文章,此時需要將發佈好的熱點文章製作成 HTML 並且上傳到雲服務器上,雲服務器將文件的地址返回給服務端。

(2)服務端獲取到文件的地址後,將文章的地址寫入數據庫中,還要做熱點文章預熱工作:文章的信息緩存到 redis、文章的信息發送到 MQ 中,MQ 通過廣播的形式將文章數據寫入到文章微服務中本地緩存上(主要目的是做多級緩存來保證請求不會直接打到數據庫上)。

(3)用戶通過客戶端搜索或者直接點擊熱點的新聞,請求先通過 LVS 轉發到 Nginx 上,隨後 Nginx 轉發到內部服務的網關上,網關最後將請求轉發到文章微服務的集羣的某臺服務器上。請求到服務器上後,先使用 sentinel 來做服務的限流和降級保護,然後查詢本地緩存,如果本地緩存無數據再訪問 redis,最保守的情況下 redis 無數據將請求數據庫。將數據返回給網關、網管將數據返回到上層。

(4)客戶端接收到數據後,通過文件的地址直接從雲服務器上下載生成好的 HTML 文件做頁面的展示。

總結:
    針對熱點文章,我們將文章使用模版引擎提前製作成 HTML 文件後上傳到雲服務器上,然後緩存熱點文章數據到本地緩存和分佈式緩存中;客戶端請求過來之後直接在緩存中將數據(包括文章的 URL 地址)給到客戶端。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/UlXV2X-jLqmazcsAT9D4bw