個人網站架構設計(二)


網站地址:http://barretlee.com

昨天對網站的架構做了一個簡要的分析,有些人不太理解,有了 NodeJS 還要 php 干啥?我推薦了幾篇文章給這位童鞋看了:

如果是一個很小的網站,是用那么多層來處理請求和響應,確實是冗余的,不過我打算將這個網站設計成一個實時平台,這個平台中包含了很多很多的通信模塊,所有后端選用 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  |  |     |
|   |                  |     |          |  |     |
|   +------------------+     +----------+--+     | 
|                                                | 
+------------------------------------------------+

 

東西越多,維護成本越高,不過我竟然覺得添加一層會有更多的樂趣...

后續會繼續記錄建站過程。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM