天天看點

必備,前台與背景分離的架構實踐

如果你經曆過創業,經曆過快速疊代業務,經曆過使用者量不斷上漲,經曆過通路并發越來越大,你一定會遇到以下系統問題:

  • 使用者通路頁面越來越慢
  • 系統性能下降,資料庫扛不住,連接配接數經常打滿,最終資料庫挂掉,重新開機後又快速挂掉
  • 改了一個小地方,另外一個看似不相幹的地方卻挂了,嚴重耦合

如果你沒有經曆過,很可能是:

  • 沒到這一步項目就死了
  • 身在所謂的大公司,用着所謂先進的架構體系

創業初期遇到上述痛點,很容易想到“三個分離”的架構優化方案:

  • 動靜分離:能夠100倍以上的提升靜态頁面/資源的通路速度,詳見《必備,動靜分離架構實踐》
  • 讀寫分離:能夠快速的線性擴充資料庫的讀性能,詳見《必備,讀寫分離架構實踐》
  • 前後分離:前台與背景的資料與通路分離,也就是本文将要重點介紹的内容

一、業務場景介紹

虛拟一個類似于“安居客”租房買房的業務場景,這個業務的資料有兩大來源:

  • 使用者釋出的資料
  • 爬蟲從競對抓取來的資料

這個業務對應的系統有兩類使用者:

  • 普通使用者,浏覽與釋出資料,俗稱“前台使用者”
  • 背景使用者,營運與管理資料,俗稱“背景使用者”
必備,前台與背景分離的架構實踐

在一個創業公司,為了快速疊代,系統架構如上:

  • web層:前台web,背景web
  • 任務層:抓取資料
  • 資料層:存儲資料

二、資料耦合的問題

系統兩類資料源,一類是使用者釋出的資料,一類是爬蟲抓取的資料,兩類資料的特點不一樣:

  • 自有資料相對結構化,變化少
  • 抓取資料源很多,資料結構變化快

如果将自有資料和抓取資料耦合在一個庫裡,經常出現的情況是:

  • -> 抓取資料結構變化
  • -> 需要修改資料結構
  • -> 影響前台使用者展現
  • -> 經常被動修改前台使用者展現邏輯,配合抓取更新

如果經曆過這個過程,其中的痛不欲生,是誰都不願意再次回憶起的。

優化思路:前台展現資料,背景抓取資料分離,解耦。

必備,前台與背景分離的架構實踐

如上圖所示:

  • 前台展現的穩定資料,庫獨立
  • 背景抓取的多變資料,庫獨立
  • 任務層新增一個異步轉換的任務

如此這般:

頻繁變化的抓取程式,以及抓取的異構資料存儲,解耦

前台資料與web都不需要被動配合更新

即使出現問題,前台使用者的釋出與展現都不影響

三、系統耦合的問題

上面解決了不同資料源寫入的耦合問題,再來看看前台與背景使用者通路的耦合問題。

使用者側,前台通路的特點是:

  • 通路模式有限
  • 通路量較大,DAU不達到百萬都不好意思說是網際網路C端産品
  • 對通路時延敏感,使用者如果通路慢,立馬就流失了
  • 對服務可用性要求高,系統經常用不了,使用者還會再來麼
  • 對資料一緻性的要求高,關乎使用者體驗的事情就是大事

營運側,背景通路的特點是:

通路模式多種多樣,營運銷售各種奇形怪狀的,大批量分頁的,查詢需求

使用者量小,通路量小

通路延時不這麼敏感,大批量分頁,幾十秒能出結果,也能接受

對可用性能容忍,系統挂了,10分鐘之内重新開機能回複,也能接受

對一緻性的要求始終,晚個30秒的資料,也能接受

必備,前台與背景分離的架構實踐

前台和背景的模式與通路需求都不一樣,但是,如果前台與背景混用同一套服務和結構化資料,會導緻:

  • 背景的低性能通路,對前台使用者産生巨大的影響,本質還是耦合
必備,前台與背景分離的架構實踐

随着資料量變大,為了保證前台使用者的時延,品質,做一些類似與分庫分表的更新,資料庫一旦變化,可能很多背景的需求難以滿足

優化思路:備援資料,前台與背景服務與資料分離,解耦。

  • 前台和背景獨立服務與資料,解耦
  • 如果出現問題,互相不影響
必備,前台與背景分離的架構實踐
  • 通過不同的技術方案,在不同容忍度,業務對系統要求不同的情況下,可以使用不同的技術棧來滿足各自的需求,如上圖,背景使用ES或者hive在進行資料存儲,用以滿足“售各種奇形怪狀的,大批量分頁的,查詢需求”

四、總結

創業初期,快速實施架構優化,提升性能的“三大分離”優化利器:

  • 動靜分離:能夠100倍以上的提升靜态頁面/資源的通路速度
  • 讀寫分離:能夠快速的線性擴充資料庫的讀性能
  • 前後分離:前台與背景的資料與通路分離

本文原計劃昨天釋出的,朋友做免費網際網路技術分享,轉了他一篇文章,不僅被罵得很慘,還取關了一大片,非常抱歉,也很遺憾。