Web應用的快取設計模式

發表於2019-05-11
ORM快取引言
從10年前的2003年開始,在Web應用領域,ORM(物件-關係對映)框架就開始逐漸普及,並且流行開來,其中最廣為人知的就是Java的開源ORM框架Hibernate,後來Hibernate也成為了EJB3的實現框架;2005年以後,ORM開始普及到其他程式語言領域,其中最有名氣的是Ruby on rails框架的ORM - ActiveRecord。如今各種開源框架的ORM,乃至ODM(物件-文件關係對映,用在訪問NoSQLDB)層出不窮,功能都十分強大,也很普及。
然而圍繞ORM的效能問題,也一直有很多批評的聲音。其實ORM的架構對插入快取技術是非常容易的,我做的很多專案和產品,但凡使用ORM,快取都是標配,效能都非常好。而且我發現業界使用ORM的案例都忽視了快取的運用,或者說沒有意識到ORM快取可以帶來巨大的效能提升。
ORM快取應用案例
我們去年有一個老產品重寫的專案,這個產品有超過10年曆史了,資料庫的資料量很大,多個表都是上千萬條記錄,最大的表記錄達到了9000萬條,Web訪問的請求數每天有300萬左右。
老產品採用了傳統的解決效能問題的方案:Web層採用了動態頁面靜態化技術,超過一定時間的文章生成靜態HTML檔案;對資料庫進行分庫分表,按年拆表。動態頁面靜態化和分庫分表是應對大訪問量和大資料量的常規手段,本身也有效。但它的缺點也很多,比方說增加了程式碼複雜度和維護難度,跨庫運算的困難等等,這個產品的程式碼維護歷來非常困難,導致bug很多。
進行產品重寫的時候,我們放棄了動態頁面靜態化,採用了純動態網頁;放棄了分庫分表,直接操作千萬級,乃至近億條記錄的大表進行SQL查詢;也沒有采取讀寫分離技術,全部查詢都是在單臺主資料庫上進行;資料庫訪問全部使用ActiveRecord,進行了大量的ORM快取。上線以後的效果非常好:單臺MySQL資料庫伺服器CPU的IO Wait低於5%;用單臺1U伺服器2顆4核至強CPU已經可以輕鬆支援每天350萬動態請求量;最重要的是,插入快取並不需要程式碼增加多少複雜度,可維護性非常好。
總之,採用ORM快取是Web應用提升效能一種有效的思路,這種思路和傳統的提升效能的解決方案有很大的不同,但它在很多應用場景(包括高度動態化的SNS型別應用)非常有效,而且不會顯著增加程式碼複雜度,所以這也是我自己一直偏愛的方式。因此我一直很想寫篇文章,結合示例程式碼介紹ORM快取的程式設計技巧。
今年春節前後,我開發自己的個人網站專案,有意識的大量使用了ORM快取技巧。對一個沒多少訪問量的個人站點來說,有些過度設計了,但我也想借這個機會把常用的ORM快取設計模式寫成示例程式碼,提供給大家參考。我的個人網站原始碼是開源的,託管在github上:robbin_site


餘下全文點此處檢視
回覆

相關文章