10 年前的一篇文章,針對《對.NET 系統架構改造的一點經驗和教訓》一文的技術要點看法。
【對.NET 系統架構改造的一點經驗和教訓】裡面的幾條對 CSDN 的改造的技術要點如下:
- 資料層放棄 SQL Server 資料庫和預存程序,全部遷移到 Linux 平台上的 MySQL 資料庫上;
- 快取不再依賴 .NET 自身提供的快取機制,遷移到部署在 Linux 平台上的分散式 Redis 上;
- 服務之間的呼叫,避免使用 .NET 自身專有協定,改成 Restful 的 HTTP Web API 呼叫;
- 靜態資源請求,不再讓 IIS 自己處理,分離到 Linux 平台上的 Nginx 去處理;
- 需要讀取的檔案系統,也改成存取 Linux 平台上的分散式檔案系統;
- 部署 .NET 程式碼的 Windows 伺服器放在 LVS 後面,用 LVS 做負載平衡和故障轉移。
1. 資料庫應該採用 SqlServer 還是 Mysql
作為 web 程式 web 端從來都不是瓶頸,瓶頸從來都是在資料端。按照正常的邏輯,.net 的執行速度要比 php 快,原因是.net 是編譯性的,php 是解釋性的。但是目前很多大型網站都部署在 php 下面。主要是 php 的現成解決方案比較多。
如果一個系統出現問題從來都不是語言的問題,而是架構的問題,或者說是架構者的問題。作為 web 服務,大部分時候的瓶頸都是在資料庫上。有同學說到 sqlserver 資料庫授權貴的問題,大家可以去 qinfo 上找一下大眾點評一個講座,他們用的是 asp.net 和 mysql 資料庫。本質上 SqlServer 和 MySQL 都是作為結構化資料庫,對開發人員來講沒有太大的不同。而資料庫的可擴充性大致就是 1)資料庫讀寫分離 2)業務水平分割 3)大表垂直分割。其他的就是細節上的實作了。
2. 快取是用自身快取還是分散式快取
CSDN 將快取遷移到 Redis, 個人覺得這個並不是.net 自身快取機制的問題,如果做分散式快取,不管是用 Memcache 還是 Redis,中間都間隔著機器,肯定沒有 web 伺服器快取快,如果業務量小的話,採用快取伺服器來替代 web 自身的快取機制其實是不划算的。當系統存取量達到一定程度,自身的快取機制已經不能夠滿足系統的要求了,是肯定要切換到快取伺服器的。當然我想沒有人會用 windows 伺服器來做快取伺服器。不管是.net 還是 java 或者 php。用 memchace/Redis 的時候難道還有效能上的差別嗎。CSDN 最先改版的應該是部落格系統,和部落格園的部落格系統用的都是一家,不過現在修修改改已經早就不是原版的樣子了。不過很難想像當年 CSDN 的部落格那麼大的使用者量用.net 自身的快取是怎麼撐過來的。看部落格園雲路的文章就知道部落格園用的是 memcached 快取的。
我的理解是,作為快取當使用者量小的時候可以用 web 自身的快取機制,當達到一定數量級後,自身快取機制無法滿足大量資料快取的需求的時候就需要切換到分散式的快取元件上去。而遵循的原則是,讓資料更加的靠近使用者。現在很多網際網路服務,使用 memcached 或是類似的 key-value 資料庫將所有的資料都放到快取裡面,而 mysql 等結構化的資料庫只是用來作為資料庫的備份,當快取失效等才會從資料庫裡面讀取資料。
3. 系統協定的選擇
微軟是一個很喜歡將一些協定裡面加入自己的東西,並且也只有自己的那一套解決方案可以用,對於選擇全套微軟的產品來說確實是很方便,但是當我們需要用到非微軟的東西的時候就傷腦筋了。在 web 服務上主要是有 webservice 或者 wcf 的 http 服務。webservice 是一套公開的標準,xml 格式的一套協定。
Web Service 是一項新技術, 能使得運行在不同機器上的不同應用無須藉助附加的、專門的第三方軟體或硬體, 就可相互交換資料或整合。依據 Web Service 規範實施的應用之間, 無論它們所使用的語言、 平台或內部協定是什麼, 都可以相互交換資料。Web Service 是自描述、 自包含的可用網路模組, 可以執行具體的業務功能。Web Service 也很容易部署, 因為它們基於一些常規的產業標準以及已有的一些技術,諸如 XML 和 HTTP。Web Service 減少了應用介面的花費。Web Service 為整個企業甚至是多個組織之間的業務流程的整合提供了一個通用機制。
在 web 傳輸中 json 是比 xml 格式更加簡短,並且能夠被 js 原生支援的格式,而且第三方的支援也不少,選擇 json 作為載體要比 xml 好。而 Restful 對我而言更像是一種資料存取風格。讓 url 請求更加清晰。而不是協定。所以在 web 系統中,做 api 我更加的傾向用 Restful 風格的 api 和 json 作為載體。如果全套都是微軟的產品,我認為 wcf 微軟出品還是最好的選擇。
4. 檔案系統的選擇
檔案伺服器放到 linux 下是比 windows 好的,最起碼 linux 不用去處理各種檔案碎片,好吧檔案服務我也沒有玩過,不好評說。
5. 靜態資源請求是 IIS 還是單獨出來
我們知道 iis 是只能夠處理靜態檔案的如果存取動態比如.aspx 檔案,iis 會交給 aspnet_isapi 來處理請求,然後將結果回傳給 iis。作為靜態檔案的處理,Nginx 比 iis 是有優勢的。靜態檔案處理的時候,我們通常會做的事情就是將 js、css 檔案進行合併壓縮,開一個或多個單獨的二級網域來作為圖片伺服器。減少前端的等待過程。或者是將圖片服務交給又拍、七牛等來處理。前段時間研究過又拍一下,提供 REST 和表單 Api 的介面,可以很方便的整合過去。而且提供 CDN 加速,比自己搞靜態檔案伺服器要便宜。
6. 負載平衡。。。
當 web 伺服器不夠用的時候,這個時候需要對 web 伺服器部署負載平衡,當然部署負載平衡的方法很多。俺也沒有部署過這玩意,不好說,當單台 web 伺服器無法支援業務需求的時候,負載平衡是必須的。
總結
所以上面 6 點中除了第二點,我認為是作者對系統理解的不夠外,其他的都是支援的。系統出現了問題,從來都不是語言的問題,而是架構的問題。當然這只是個人想法,也許我所認知的都是錯的。
作者:張巍 出處:http://beixiu.net/