人人網移動開發架構(下)
相關文章:人人網移動開發架構(上)
真的可以統一架構嗎?
可以,瀏覽器本身就是一個非常優秀的跨平臺解決方案,但這個方案的前期投入非常大,且項目執行風險過高,人人網的業務大都是基本動態網頁實現,使用了大量的AJAX及Flash技術,最終我們放棄了瀏覽器方案,我們要的統一架構肯定不是這個。
山窮水盡,柳暗花明
放棄了瀏覽器的方案,我們可謂山窮水盡,難道還有第三個方案?Facebook的iPhone應用給了我們很大靈感,看圖:
圖3
從產品的角度看,這個圖顯示的布局與我們***次嘗試的設計沒什么區別,深入一點我們會發現,這個設計與之前的設計***區別在于頁面跳轉,每個標簽都有獨 立的一個視圖棧,理論上無限大,通過當前棧頂視圖可以打開新的視圖后自動壓棧保存,當前視圖如果要后退默認退回視圖棧里保存的上一個視圖的內容。那如果是 標簽1的頁面需要跳轉到標簽2對應的頁面怎么辦呢,是否自動切標簽?答案是不切,標簽只是用于業務導航,且有獨立的視圖棧,視圖棧中的頁面可以與業務無 關,打個很好理解的比方:當我們在使用Chrome的瀏覽器時,我們同時在多個標簽分別打開多個不同網站或頁面,也可以打開同樣的網站或頁面,每個標簽都 有一個獨立的后退的記錄,這種設計非常有規律,用戶容易理解不容易暈,現在頁面跳轉及后退的問題很好的解決了。不論JavaME,還是iPhone或者 Android的客戶端,我們都使用了同樣的設計。
數風流人物,還看今朝
當我們客戶端都使用了這種標簽+視圖棧的方案以后,我們的各平臺在設計上基本達到了統一,并在現有設計上快速迭代演進。大家可能想了,在代碼層統一這才 叫本事,也許你沒錯,但是我們不會輕意再做這樣高風險的嘗試,如今手機平臺的差異相當的大,就從主流平臺的開發語言看就夠你折騰了,JavaME及 Android是使用的Java , iPhone使用的是 Objective-C,Symbian是純C++, 現在諾基亞與微軟聯姻WP7,可WP7將不再支持C/C++的開發,主推C# + Silverlight,好吧,我們只能再觀察一下了。
在接下來的一到兩年,移動互聯網將以***的速度發展,大部分互聯網公司都開始了或已經推出了較成熟的移動終端的解決方案,創業公司也會層出不窮,推出各種優秀的移動終端應用:移動支付,LBS,基本通訊簿的即時通信,手機音樂,手機視頻,手機閱讀等等,iPad點燃平板電腦的硝煙,平板的設計再次給了我們很大的挑戰,數風流人物,還看今朝。
高可靠性和可擴展的服務
現在移動互聯網拼的都是服務,客戶端良好的用戶體驗背后,都有強大的服務器技術支撐,人人網也不外如是。
業務層次模型
人人網采用JavaEE技術作為主要的業務解決方案,基本按照通用的JavaEE模型進行架構設計,如下圖:
圖4 人人網業務層次模型
- WEB層基于REST風格和MVC設計模式,為用戶提供基于WEB的訪問接口人人網采用的是自己開發的WEB框架 Rose,該框架基于Spring Framework,類似RoR框架,增強了對Controller編碼部分的默認約定和REST風格URL的支持,該項目前已開源,下載地址為http://code.google.com/p/paoding-rose/
- 業 務層封裝業務邏輯,為WEB層提供業務接口,操作數據訪問層提供的數據。人人網開發了自己的SOA框架XOA以支持業務層抽象,該框架結合Rose框架, 以REST風格對業務進行分類、消息格式封裝和路由,如以下URL:xoa://blog.xoa.renren.com/photo/{user- id}/{photo-id}該URL代表某用戶的某個照片,操作 GET/PUT/POST/DELETE分別對應對應照片資源的讀、修改、新增、刪除。即通過資源+操作的方式對外提供Service。 XOA支持遠程調用,并可以通過簡單添加服務器的方式進行橫向擴展。該框架目前準備開源,敬請關注。
- 數據訪問層提供對數據庫訪問的封裝人人網使用Java語言開發了自己的Object-Relation Mapping框架JADE(Java Database Engine),并支持數據庫的水平橫向切分。該框架和Rose框架一體開源,下載地址相同。
- 數 據持久層數據的持久存儲,主要采用MySQL數據庫,并且開發了自己的海量存儲系統Nuclear。Rose、Jade、XOA作為集成度很高的一整套解 決方案,在人人網大量采用,大大降低了開發成本,并在框架級解決了服務于企業解決方案的JavaEE技術在互聯網領域的適用性。
可擴展的高性能系統
人人網每天都要承受億級PV海量用戶的并發壓力,和其它大型互聯網站點類似,服務器架構方面做了很多工作。
高性能數據存儲系統
在數據存儲方面,人人網做了以下工作:
- 和其它互聯網大型站點相同,MySQL數據庫做水平拆分以支持橫向擴展
- 人人網作為國內***大SNS網站,欲存海量UGC數據,必有海量存儲系統。Nuclear存儲系統在高性能、高可靠、可擴展的海量數據存儲需求下橫空出世。
Nuclear本身的數據存儲基于Key-Value形式,底層可以使用MySQL/Memory, Cassandra, TC, Redis等存儲引擎,提供弱結構化的查詢功能。
- 高擴展性一個Nuclear集群支持1到n(n<264)個節點(Node)的規模
- 高可靠性單個節點的crash永遠對系統的運行造成影響,不存在單點風險。系統永遠可寫入。
- 高性能在4個節點、一般服務器配置情況下有測試數據表明單節點訪問可達15862 req/s, 平均單次請求耗時僅5ms。
可擴展的高性能業務服務系統
人人網的業務層是支持分布式、可橫向擴展的。
- 人人網主要使用JavaEE架構進行業務開發,其中Spring提供的IoC和AOP功能分別起到了業務對象裝配和橫向關注點分離的良好 抽象。XOA框架基于Spring和netty,使用google的spdy協議作為網絡傳輸協議,除享受到Spring紅利之外,也提供了基于Java NIO的網絡高性能服務器環境。單個XOA服務是無狀態的,具有冪等性,XOA客戶端使用Java NIO、通過Keep alive保持對各個后臺服務器的TCP長連接,可實時監測后臺服務器的健康狀況,并把用戶請求負載分散到各個后臺服務器上,在單個節點失效的情況下不影 響服務,如圖5所示:
圖5 XOA負載均衡 - 很多關鍵性的業務對性能要求特別高,也需要借助很多Linux操作系統的特性,這時Java的優化已經不能滿足需求,需要使用 C++語言進行開發。人人網采用ICE框架, 進行這部分業務的開發,它解決了Java、C++等多種語言開發的框架和通訊問題。人人網目前使用ICE進行開發的業務層稱之為中間層,主要解決類似搜 索、用戶好友關系計算等性能要求苛刻的底層關鍵性業務問題。其運維模式和XOA類似。和其它大型網站一樣,業務層使用Memcached作為業務層的分布 式數據緩存,且根據業務將緩存集群劃分為多個池,集中進行管理,如圖6所示:
-
圖6 Memcached Pool
- 在WEB層,使用目前性能***的Servlet容器產品Resin作為HTTP Server,使用自行開發的Java WEB MVC框架Rose對用戶請求請求分發。負載均衡方面使用了F5或者nginx。為了減少Session復制同步的開銷,每臺WEB Server都禁用Servlet Session, 即每臺服務器都是無狀態的,單個Web Server失效后,不會發生用戶狀態丟失的問題。用戶狀態的跟蹤由中間層統一處理。
對移動終端的支持
服務器對移動終端的支持主要是通過HTTP協議提供json數據接口實現的,服務器基本采用了人人網共同的架構:
- HTTP WEB層做了更多的MVC抽象,除了提供基于html的Page View之外,還生成只提供json或者其他數據格式的Feed View。
- 服務器通過gzip壓縮減少流量,節省用戶資費。
- 客戶端構建REST風格的HTTP請求,WEB服務器下發數據完成遠程調用。
3G的API層直接面向移動終端,提供基于HTTP和其他Socket協議的服務器訪問接口,并在業務層抽象出3G部門自己的公共平臺,如圖4所示:
圖7 3G API架構
除此之外,針對移動終端的特點和中國特色的移動互聯網環境,做了一些特殊的工作:
- 低端機型運算能力和內存資源都有限,API平臺做了相應優化
- 復雜的運算服務器完成,減少移動終端負載。如圖片的縮放、裁剪運算、圖片質量就是服務器進行的。
- 客戶端和服務器進行的數據輸入輸出盡量減小,這樣可以節省內存存儲。在表示相同數據的情況下,盡量采用數據量小且易于解析的格式。API平臺使用了JSON,沒有使用XML
- 為了減少用戶資費,傳輸流量進行了控制
- nginx開啟gzip壓縮,減少網絡傳輸流量。
- 中國移動的cmwap網關會自動對服務器輸出的gzip流進行解壓縮,從而使nginx的zip壓縮失去了意義。這種情況下,api服務器對輸出進行gzip壓縮后,作為普通二進制流進行響應輸出。
- 除了純文本的json之外,api服務器也支持基于google protocol buffers格式的輸出,從而提供更緊湊的格式輸出。
- 提高客戶端訪問速度
- Api平臺支持基于邏輯時序的批處理操作,將多個api的網絡接口調用合并為一個,減少多次tcp握手造成的巨大時間損耗,提高客戶端每個UI界面的響應和顯示速度。