濟南軟件開(kāi)發(fā)之對(duì).NET系統架構改造的經(jīng)驗和教訓

2015-09-17 16:05:06
    濟南軟件開(kāi)發(fā)向(xiàng)您介紹,怎樣(yàng)搭建合适的網站框架:
    1、數據層放棄SQL Server數據庫和存儲過(guò)程,全部遷移到Linux平台上的MySQL數據庫上;
    2、緩存不再依賴.net自身提供的緩存機制,遷移到部署在Linux平台上的分布式的Redis上;
    3、服務之間的調用,避免使用.net自身專有協議,改成(chéng)Restful的HTTP Web API調用;
    4、靜态資源請求,不再讓IIS自己處理,分離到Linux平台上的nginx去處理;
    5、需要讀取的文件系統,也改成(chéng)訪問Linux平台上的分布式文件系統;
    6、部署.net代碼的Windows服務器放在LVS後(hòu)面(miàn),用LVS做負載均衡和故障切換;
    簡單說來,就(jiù)是單純讓.net做應用層的編程語言和框架,其他都(dōu)交給Linux平台的開(kāi)源解決方案。而.net框架單純做應用層,無論ASP.net MVC的開(kāi)發(fā)效率,還(hái)是.net CLR虛拟機的運行效率都(dōu)非常好(hǎo),目前我們單台Windows服務器上跑幾百萬的動态請求毫無壓力,而且應用層架構是可以橫向(xiàng)擴展的:如果請求負載非常高,隻需要添加更多Windows服務器即可。總之,做到了揚長(cháng)避短。
    我們濟南軟件開(kāi)發(fā)還(hái)有熟悉大型互聯網技術架構的人應該很容易的發(fā)現,這(zhè)個重構過(guò)程其實就(jiù)是一個“讓合适的東西幹合适的事(shì)情”這(zhè)樣(yàng)一項工作:
    1、把過(guò)多業務邏輯寫到存儲過(guò)程中必然導緻數據庫服務器壓力的增大,而且不利于負載均衡,因此去“存儲過(guò)程”是必要的;
    2、SQLServer實現集群的能(néng)力很差,用MYSQL之類的數據庫是一個不錯的選擇;
    3、緩存還(hái)是用.Net内置的InProc緩存機制對(duì)于高并發(fā)的網站來講是一個災難,用Redis之類分布式緩存來代替是必然的過(guò)程;
    4、使用.Net Remoting之類的私有協議不利于異構系統集成(chéng),改成(chéng)webservice、REST也是必須的;
    5、靜态文件的請求也經(jīng)過(guò)IIS有點太勞煩IIS了,扔給nginx才更合适;
    6、Windows服務器的文件系統很不靈活,換成(chéng)更加靈活的Linux下的分布式文件系統是聰明的;
    7、采用LVS、nginx之類做負載均衡也是最合适的。
     其實任何一個大型互聯網基本都(dōu)是這(zhè)樣(yàng)一個架構:前端使用nginx等做負載均衡,使用Redis、memcached等做分布式緩存,使用數據庫集群進(jìn)行讀寫分離之類的優化,使用分布式文件系統處理圖片等靜态文件。 請問,使用PHP、Java等做web服務器開(kāi)發(fā)的大型互聯網,哪個使用JSP内置的Session對(duì)象做Session的,不都(dōu)要換用redis嗎?哪個把圖片和php放到一個服務器的,不都(dōu)放到文件服務器中嗎?哪個一個apache服務器就(jiù)可以扛起(qǐ)來的,不都(dōu)是nginx之類的擋在前面(miàn)做負載均衡的嗎? 怎麼(me)不說“去php化”、“去java化”呢?要知道(dào)redis、memcached、ngix之類的可都(dōu)不是java、php寫的呀,一個java項目竟然用其他語言寫的東西,難道(dào)不丢面(miàn)子?
    我們濟南軟件開(kāi)發(fā)認爲,其實一個大型的系統中,根據項目的不同特點來組合搭配不同的産品、組件是一個必然的過(guò)程,去了解一下這(zhè)些系統中“混搭”是常見的現象。單一産品中提供能(néng)的功能(néng)隻能(néng)滿足普通項目的需求,要想滿足複雜的項目,必須把這(zhè)些産品中提供的一些傻瓜化的簡單組件用更專業的組件來替換,就(jiù)像做小項目php中的Session足夠了,但是大項目必須用c/c++開(kāi)發(fā)的memcached來替換。