架構反思案例之網站架構案例

項目的背景前端

  公司已有一個桌面版程序,須要開發一個對應的網站程序,這樣用戶就不用安裝桌面程序,也不用再關心升級和更新的問題,全部桌面的操做均可以在網站上完成。數據庫

項目的設計後端

1. Browser瀏覽器

  這是沒得選的,必需要有。服務器

  這裏咱們主要考慮了兩點:網絡

  第一點,因爲瀏覽器端和服務端須要頻繁的交互數據,因此咱們選擇了WebSocket做爲先後端的通訊技術,可是WebSocket並非每一個瀏覽器都支持的。這個時候咱們考慮了socket.io,它比較無缺的封裝了WebSocket,並且對於不支持WebSocket的瀏覽器也提供了輪詢等替代的方式,這些是socket.io本身處理的,不須要外界強行干預,至關方便,因此咱們選擇了socket.io做爲通訊的媒介。架構

  第二點,因爲是參照桌面UI開發的程序,咱們選擇了單頁面技術實現用戶的界面。爲了複用一些相同的UI,咱們使用了Google Closure提供的相關的模板技術,動態的根據需求生成元素,而後使用JQuery添加到頁面中。JQuery也算是前端沒法忽視的一個類庫了,咱們照樣使用。異步

2. WebServersocket

  這也是沒得選的,必需要有。分佈式

  考慮到先後端有着頻繁的交互需求,並且這些交互並不是CPU密集計算型的操做,大可能是與Browser進行數據交互,因而選擇NodeJS建立服務器,對我我的來講,我始終認爲NodeJS將異步回調機制演繹到了無人可敵的地步。

  WebServer從角色上來講,主要實現了下列功能:

  一是,做爲鏈接Browser和BackendServer的媒介,全部程序交互的數據都是經過WebServer轉發的。WebServer與Browser的通訊採用WebSocket (socket.io)實現,而WebServer與BackendServer通訊採用一般的TCP Socket來實現。

  二是,WebServer經過BackendServerInspector組件管理BackendServer,這個在下面會提到。

  三是,WebServer直接管理用戶的Session信息,在這裏,全部的用戶數據都存儲在MongoDB中。

3. BackendServer

  由於桌面程序已經存在,因此能夠重用程序全部的業務邏輯,因而網站的架構在傳統的Browser/Server的基礎上,再加上了BackendServer組件。

  BackendServer組件是一個命令行執行的exe程序,它包含全部桌面程序的邏輯和數據,只是把UI部分剝離出去了。BackendServer與WebServer的通訊採用一般的TCP Socket通訊機制。

4. BackendServerInspector

  除了這些主要的組件外,因爲BackendServer只是把UI剝離的桌面程序,因此每一個功能並非鬆散的,一個BackendServer一次只能處理一個用戶的數據,因此咱們須要一個BackendServerInspector這樣的管理組件,這個組件負責啓動,關閉和檢測BackendServer。

  當WebServer須要處理一個新用戶的時候,BackendServerInspector會檢查是否有可用的BackendServer,若是沒有可用的BackendServer則啓動一個新的BackendServer程序。若是一個BackendServer程序沒有響應的話,則會去關閉這個BackendServer程序。

5. MongoDB

  爲了存儲用戶的信息,咱們使用MongoDB做爲數據庫。NoSql這年發展的是如火如荼,咱們也決定在項目中採用,這裏考慮的不只是MongoDB高效的性能,還有RESTFull API,天生的分佈式特性也是咱們考慮的因素,雖然大多數有點實際中並無用到,可是相對於關係數據庫來講,免去對數據庫抽象的過程(ORM,或者說是Hibernate)仍是挺舒服的。

項目的實現

1. 重用桌面程序

  這是項目的發起背景,爲了在有限的時間內重用桌面程序的功能,使得咱們並無足夠的事件將這個桌面程序的功能與界面剝離感受,打造一個純粹的SOA服務也只不過是一個響亮的口號而已,甚至不少的人根本就沒這個意思。

  這個部分最終的結果只是將原來的程序添加上了收發消息的TCP Socket模塊,完成與WebServer通訊的功能,UI系統幾乎是完整的保留了。

2. NodeJS特性

  這個部分不用多講了,NodeJS的也是近來煊赫一時的的技術了,採用這個實現WebServer也並沒有什麼大的不一樣,只是特別要注意不要阻塞主線程。

3. HTML5圖形處理

  我我的以爲,HTML5中的Canvas是Web上圖形處理的首選,普通的2D操做使用Canvas的API就能夠搞定,複雜的3D世界則要使用WebGL開發,這也是一個在瀏覽器中並不通用的技術,因此咱們一直推薦客戶使用Chrome和Firefox瀏覽器。

4. NoSQL趨勢

  MongoDB也是一個新新技術,採用這個實現用戶信息的持久化是足夠的,實現上並沒什麼大的難點。

5. AWS - 亞馬遜雲服務

  咱們嘗試了亞馬遜的雲服務,這種雲服務對傳統的服務器絕對是一種巨大的衝擊,擴展性能和易用性絕對是傳統技術沒法比擬的。難怪這個雲服務是不少創業公司的首選。

項目的反思

  這個項目的開始有點探索性的意味,最終因爲服務器成本過高被叫停。

  這個項目的優勢是使用了不少新型的技術保證高效的交互性能和可擴展性。不足是頻繁的交互致使網絡流量太大,網絡費用過高。

  我我的以爲這個設計值得提升的地方就是,應該把桌面程序的UI相關邏輯包括一些概念完全與底層命令和操做分離,把它們放到頁面上去實現,這樣能夠節省一部分流量。可是剝離這些邏輯,開發一個比較純淨的面向服務的程序,成本無疑也是很高的。

相關文章
相關標籤/搜索