網站地址:http://barretlee.com
昨天對網站的架構做了一個簡要的分析,有些人不太理解,有了 NodeJS 還要 php 干啥?我推薦了幾篇文章給這位童鞋看了:
- 也談基於NodeJS的全棧式開發(基於NodeJS的前后端分離)
- 基於前后端分離的模版探索
- Midway-ModelProxy — 輕量級的接口配置建模框架
- 前后端分離模式下的安全解決方案
- Web 研發模式演變
如果是一個很小的網站,是用那么多層來處理請求和響應,確實是冗余的,不過我打算將這個網站設計成一個實時平台,這個平台中包含了很多很多的通信模塊,所有后端選用 NodeJS 作為 I/O 處理器,這是可以理解的。php 用於通信,連接消耗大,而且不方便並行處理,效率很低。在網絡通信和I/O處理上,NodeJS是很優秀的工具。
1. 小小網站,為啥我要如此看重后端
其實最主要的原因是,我買的主機配置很低。呵呵,是的,昨天很多朋友在留言里都提到了購買雲主機/VPS相關的東西。今天我也是花了不少時間在各個群里請教,並且也訪問、對比了一些雲主機供應商的網站。之前在 V2ex 上看到了不少相關的帖子,今天進去翻,沒翻到之前點過贊的貼。過程就不多說了,開始打算買個國外的主機,不用備案~ 后來嫌麻煩,買了個阿里雲服務器:
CPU: 1核
內存: 512MB
數據盤: 40G
帶寬: 1Mbps
買一年省倆月的錢,總共是七百多。選用的 Ubuntu 12.04, 64位系統。不過呢,我並沒有一次性買一年的,先花幾十塊錢買了一個月,試用,反正以后續費還是原價(不像域名那樣坑爹,續費就漲價)。域名我是一次性買的十年的,55/年,這東西不貴,多買幾年,省事兒。然后進入阿里雲的流程,正在備案中...
回到重點,為啥看重后端,看到上面的配置,相比大家也知道了,搞一個實時通信的網站,每個連接后端都需要內存來處理,而且這個內存在鏈接斷開之前是不會釋放的(socket連接),目測同時在線超過30個人,系統就要卡住了。內存是一個很大的瓶頸,然后就是帶寬了,1M真的很低。其實買個配置高點的主機,一年也就一兩千,這次故意買個最低配置是為了讓自己培養珍惜流量意識,希望編程可以考慮到每個 byte 的消耗,等這種意識(或者技術)養成了,再提高主機的配置。
第二個原因就是熟悉后端,數據庫方面的處理一直是自己的弱項,如果不試着提高下,以后工作中遇到坎就會很難受了。這段時間在阿里實習,經常會感覺有些知識不夠用了,希望返校繼續加強學習。
2. 前端也是重點
前端有一個很大膽的嘗試,“數據在前端”。
打開一個網頁,瀏覽器發送請求到服務器,服務器從數據庫里獲取數據,經過后台腳本的拼裝處理,然后輸出到前端,這是最常見的方式。這種方式的缺點就是,頻繁的讀取數據庫,然后還有一大堆經過HTML標簽包裝過的數據傳到前端,期間的冗余消耗是特別大的。於是有人就想到了,后端的數據全部使用JSON方式輸出,到了前端再渲染數據,這種方式獲得了一定的優化效果,前端端的分離似乎也很明顯,但是前端負擔就太重了,數據的處理和渲染都是前台,也就是承擔了Controller和Views的角色,前台很累,他累了也會發脾氣,比如:數據到了,要半天之后才解析完畢,再花半天將其渲染出來。同時這種處理方式也不利於SEO。
現在的嘗試是,前端就是一個數據庫,每個用戶都有數據庫數據的一個備份。
+----------+ | | | Database | | | +-----|----+ | +---------|----------+ /| |\ / | Server | \ / | | \ / +----|----------|----+ \ / | | \ +---------/+ +------|---+ +---|------+ +\---------+ | | | | | | | | | Client |..| Client |..| Client |..| Client | | | | | | | | | +-----|----+ +-----|----+ +-----|----+ +-----|----+ | | | | +-----|----+ +-----|----+ +-----|----+ +-----|----+ | | | | | | | | | Local | | Local | | Local | | Local | | Storage | | Storage | | Storage | | Storage | | | | | | | | | +----------+ +----------+ +----------+ +----------+
瀏覽器每次連接到服務器,都會將服務器的數據同步到本地,打開頁面,第一件事是呈現當前LocalStorage的數據,然后發送一個請求詢問服務器,“是否有數據更新啊?”,每次只拉去更新的數據。
有人會覺得這種方式不可取,本地存不了這么多東西啊。當然存不了這么多,一篇文章有作者、標題、日期、概要還有內容,我們可以在本地儲存除內容之外的所有東西,就算有100篇文章,其緩存的量也不過幾百KB,試想你加載個 JQ 是不是也得上百KB啊~那么每次我們從后端拉取的數據量就十分小了。
至於本地儲存的實現方式,這個好處理,LocalStorage、IndexDB、UserData等等,方式很多,還有一些其他比較 hack 的方式,我以后再介紹。
3. 前后端之間的屏障
后端會有很多的服務,比如郵件、HTTP、HTTPS、socket等等,再比如:A域名、B域名、A子域名、B子域名的處理等等。為了處理偽靜態,安全,緩存,動靜頁面分離等多個問題,決定在昨天考慮的架構上再加一層 Nginx。
+------------------+ +------------------+ | Front-End | | Browser | | 前端處理 | +--------------+ | | |←---→| LocalStorage | | +--↑-----↑-----↑---+ +--------------+---+ | | | | | | | | | +------------------+ | Nginx | +---- 請求/代理 ---------------------------+ | | | | | +------------------+ | | | | | | | | | | | | +--↓-----↓-----↓---+ | | | NodeJS | +-------------+ | +-->| 處理I/O | | Database | | | | |←-+-→| | | | +-----|-----↑------+ | | | | | | | | | | | | +-----↓-----|------+ | +----------+ | | | | PHP | | | | | | +-->| 處理數據 |←-+-→| cache | | | | | | | | | | | +------------------+ +----------+--+ | | | +------------------------------------------------+
東西越多,維護成本越高,不過我竟然覺得添加一層會有更多的樂趣...
后續會繼續記錄建站過程。