先定个小目标, 使用C# 开发的千万级应用
話說昨天的港股發(fā)生了一件大事,騰訊成為亞洲市值最高的公司,在這歷史性的一刻,作為在鵝廠工作的C# 程序員,也應該讓世人了解下C# 并不是那么沒有市場。在鵝廠,代碼構(gòu)成中60%以上是C++, C#也有10%左右的份額,后續(xù)的文章中我會和你繼續(xù)分享,當然如果你有興趣加入鵝廠會更快獲取類似信息,需要可以找我內(nèi)推。小二計劃寫幾篇文章來讓大家正確的認識下C#。
當我們還沒來得及把自己的夢想捂熱的時候,偉大的王老師一語驚醒了所有吃瓜的圍觀群眾——人嘛,光著眼于夢想是不行滴,還是要先定一個能達到的小目標。一個一天處理5000萬級別的應用,換算成每秒578個請求,當然應用不會這么平淡,有高峰有低谷,不過這也不是很難達到的目標,我們就來看看這樣的一個小目標如何實現(xiàn),這里分享的是我的一個真實案例:騰訊OA基礎(chǔ)服務,簡稱TOF。
首先給出一個直觀的數(shù)據(jù),讓大家有個初步的印象。
2015-11-5 這天的組織架構(gòu)API的請求數(shù)達到36535867,超過了三千萬的請求,這天的總請求數(shù)48922122,接近五千萬的請求。?
你很難想象到TOF使用的是.NET技術(shù)構(gòu)建的,能夠在每天幾千萬請求,可以媲美同樣是.NET技術(shù)構(gòu)建的StackOverflow社區(qū),不過確實我也使用了大量StackOverflow開源的.NET技術(shù),架構(gòu)上也非常像StackOverflow。下面列下硬件列表:
·6臺數(shù)據(jù)庫服務器(6臺SQL Server),其中3臺SQL Server 2012 Always集群式核心數(shù)據(jù)庫使用的是物理服務器
·12臺Web服務器(IIS7.5),服務器是IT云VD-6機器(8核32G內(nèi)存)
·2臺分布式緩存服務器(Redis),服務器是IT云VD-5機器(4核16G內(nèi)存)
·8臺應用服務器(處理TOF的核心業(yè)務,使用WCF服務構(gòu)建),服務器是IT云VD-6機器(8核32G內(nèi)存)
·IT云提供的負載均衡服務器(LVS集群)
這些服務器都是虛擬化的服務器,騰訊IT有個內(nèi)部的私有云平臺的機器,比StackOverflow的服務器比起來要弱很多。但是我在程序的架構(gòu)和性能優(yōu)化方面做了很多,程序架構(gòu)上采用微服務架構(gòu)的思想,一圖勝千言,下面給出TOF的架構(gòu)圖:
上面是總體的架構(gòu)圖,那么每個具體的服務又遵循了單體應用的架構(gòu),使用的是N層服務,一圖勝千言,下面給出TOF的服務架構(gòu)圖。
負載均衡(LVS)
負載均衡使用的LVS和tlinux,負載均衡器使用的是IT云的LVS集群,通過IT云進行管理
Web層架構(gòu)(IIS 7.5,ASP.Net MVC 5.2.1,和.Net 4.5.2)
TOF經(jīng)過負載均衡層導入流量到12臺Web服務器, 分區(qū)域部署在2個地區(qū),Web層通過WCF服務同后端的業(yè)務服務交互。
服務層(WCF 4.5, Net 4.5.2)
在整體邏輯架構(gòu)圖上可以清晰的看到,緊挨著Web層的是服務層(部署在Window服務器Windows 2008 R2上)。服務層基于WCF實現(xiàn)的微服務架構(gòu)。為了提升這服務做了非常多的冗余,每個服務都有至少3個實例。
緩存(Redis)
TOF在緩存層用Redis,Redis服務器16G內(nèi)存,采用master/slave結(jié)構(gòu)部署,盡管每天2500萬的ops,每個實例的CPU使用率也在2%之下。
Redis所在服務器有L1/L2高速緩存,Web服務的HTTP緩存設(shè)置在一級緩存L1中,Redis緩存在二級緩存L2。當用戶訪問在一級緩存L1中未命中后會去二級緩存中的Redis取值,如果web服務在L1和L2兩級緩存都未命中,則會直接去原始數(shù)據(jù)源獲取(比如,數(shù)據(jù)庫查詢,API回調(diào)等),然后并把獲取到的結(jié)果緩存到本地和Redis中,這時其它服務未命中L1高速緩存便會去二級緩存L2/Redis中獲取,節(jié)省了調(diào)用數(shù)據(jù)庫查詢或者API回調(diào)的訪問時間。
OA登陸和組織架構(gòu)都有自己的L1/L2高速緩存,通過L1緩存Key前綴、L2/Redis緩存數(shù)據(jù)庫ID。
貼張Redis緩存服務已經(jīng)運行445天,處理了110億的請求的監(jiān)控圖:
數(shù)據(jù)庫(SQL Server)
SQL Server是TOF唯一的源數(shù)據(jù)庫,所有Redis的數(shù)據(jù)都來自SQL Server。使用微軟的SQL Server監(jiān)控組件AlwaysOn Availability Groups部署了一個SQL Server集群。服務器集群的配置也比較低4核32G 的A5機器?!?/p>
所有數(shù)據(jù)庫過去24小時CPU監(jiān)控圖如圖所示,大部分情況CPU使用率較低,偶爾做下緩存任務時會高些。
細心的朋友可能看出上圖就是使用StackOverflow開源的Opserver所采集的數(shù)據(jù)。
.NET應用程序性能優(yōu)化
TOF系統(tǒng)屬于高并發(fā)的系統(tǒng),使用系統(tǒng)默認的配置是不行的,需要對操作系統(tǒng)和.NET框架做優(yōu)化:
Windows優(yōu)化:調(diào)整tcp連接數(shù),保證系統(tǒng)層面保證服務的不受限于操作系統(tǒng),調(diào)整操作系統(tǒng)的TCP/IP參數(shù),比如把Time_Wait 時間窗口2分鐘à45秒,可用的端口數(shù)調(diào)整到65535,默認才5024個,對一個大并發(fā)的系統(tǒng)來說遠遠不夠。
Web服務器優(yōu)化:根據(jù)服務器的CPU核數(shù)調(diào)整進程數(shù)和HTTP層相關(guān)配置。
WCF框架的參數(shù)優(yōu)化:
采取NETTCP綁定,保證框架通信的高效率
?序列化:xml -> rest\json ->protobuf,適配器模式,使用protobuf替代wcf默認的二進制序列化,這里就可以6倍的性能提升。
?根據(jù)服務流量調(diào)整WCF流量限制配置的值 ?
??總體來說,TOF整體架構(gòu)并沒有采用那些非常高端的技術(shù),使用的都是非常普通的.NET技術(shù),混合使用Windows/Linux和開源技術(shù)照樣可以打造高性能高并發(fā)的應用系統(tǒng)。?
相關(guān)文章:
Stack Overflow研發(fā)副總裁:.NET技術(shù)并不差,合適自己就好
.NET技術(shù)+25臺服務器 怎樣支撐世界第54大網(wǎng)站
Stack Overflow通過關(guān)注性能,實現(xiàn)單塊應用架構(gòu)的擴展能力
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注
贊賞
人贊賞
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的先定个小目标, 使用C# 开发的千万级应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual Studio “15”的第
- 下一篇: 如果你也会C#,那不妨了解下F#(5):