先定個小目標, 使用C# 開發的千萬級應用


 

dotNET跨平台

opendotnet

在這里你可以談微軟.NET,Mono的跨平台開發技術,也可以談談其他的跨平台技術。
在這里可以讓你的.NET項目有新的思路,不局限於微軟的技術棧,橫跨Windows,Linux 主流平台

話說昨天的港股發生了一件大事,騰訊成為亞洲市值最高的公司,在這歷史性的一刻,作為在鵝廠工作的C# 程序員,也應該讓世人了解下C# 並不是那么沒有市場。在鵝廠,代碼構成中60%以上是C++, C#也有10%左右的份額,后續的文章中我會和你繼續分享,當然如果你有興趣加入鵝廠會更快獲取類似信息,需要可以找我內推。小二計划寫幾篇文章來讓大家正確的認識下C#。

當我們還沒來得及把自己的夢想捂熱的時候,偉大的王老師一語驚醒了所有吃瓜的圍觀群眾——人嘛,光着眼於夢想是不行滴,還是要先定一個能達到的小目標。一個一天處理5000萬級別的應用,換算成每秒578個請求,當然應用不會這么平淡,有高峰有低谷,不過這也不是很難達到的目標,我們就來看看這樣的一個小目標如何實現,這里分享的是我的一個真實案例:騰訊OA基礎服務,簡稱TOF。

首先給出一個直觀的數據,讓大家有個初步的印象。

 

2015-11-5 這天的組織架構API的請求數達到36535867,超過了三千萬的請求,這天的總請求數48922122,接近五千萬的請求。 

你很難想象到TOF使用的是.NET技術構建的,能夠在每天幾千萬請求,可以媲美同樣是.NET技術構建的StackOverflow社區,不過確實我也使用了大量StackOverflow開源的.NET技術,架構上也非常像StackOverflow。下面列下硬件列表:

·6台數據庫服務器(6台SQL Server),其中3台SQL Server 2012 Always集群式核心數據庫使用的是物理服務器

·12台Web服務器(IIS7.5),服務器是IT雲VD-6機器(8核32G內存)

·2台分布式緩存服務器(Redis),服務器是IT雲VD-5機器(4核16G內存)

·8台應用服務器(處理TOF的核心業務,使用WCF服務構建),服務器是IT雲VD-6機器(8核32G內存)

·IT雲提供的負載均衡服務器(LVS集群)

這些服務器都是虛擬化的服務器,騰訊IT有個內部的私有雲平台的機器,比StackOverflow的服務器比起來要弱很多。但是我在程序的架構和性能優化方面做了很多,程序架構上采用微服務架構的思想,一圖勝千言,下面給出TOF的架構圖:

 

上面是總體的架構圖,那么每個具體的服務又遵循了單體應用的架構,使用的是N層服務,一圖勝千言,下面給出TOF的服務架構圖。

負載均衡(LVS

負載均衡使用的LVS和tlinux,負載均衡器使用的是IT雲的LVS集群,通過IT雲進行管理

Web層架構(IIS 7.5ASP.Net MVC 5.2.1,和.Net 4.5.2

TOF經過負載均衡層導入流量到12台Web服務器, 分區域部署在2個地區,Web層通過WCF服務同后端的業務服務交互。

服務層(WCF 4.5 Net 4.5.2

在整體邏輯架構圖上可以清晰的看到,緊挨着Web層的是服務層(部署在Window服務器Windows 2008 R2上)。服務層基於WCF實現的微服務架構。為了提升這服務做了非常多的冗余,每個服務都有至少3個實例。

緩存(Redis

TOF在緩存層用Redis,Redis服務器16G內存,采用master/slave結構部署,盡管每天2500萬的ops,每個實例的CPU使用率也在2%之下。

Redis所在服務器有L1/L2高速緩存,Web服務的HTTP緩存設置在一級緩存L1中,Redis緩存在二級緩存L2。當用戶訪問在一級緩存L1中未命中后會去二級緩存中的Redis取值,如果web服務在L1和L2兩級緩存都未命中,則會直接去原始數據源獲取(比如,數據庫查詢,API回調等),然后並把獲取到的結果緩存到本地和Redis中,這時其它服務未命中L1高速緩存便會去二級緩存L2/Redis中獲取,節省了調用數據庫查詢或者API回調的訪問時間。

OA登陸和組織架構都有自己的L1/L2高速緩存,通過L1緩存Key前綴、L2/Redis緩存數據庫ID。

貼張Redis緩存服務已經運行445天,處理了110億的請求的監控圖:

數據庫(SQL Server)

SQL Server是TOF唯一的源數據庫,所有Redis的數據都來自SQL Server。使用微軟的SQL Server監控組件AlwaysOn Availability Groups部署了一個SQL Server集群。服務器集群的配置也比較低4核32G 的A5機器。 

所有數據庫過去24小時CPU監控圖如圖所示,大部分情況CPU使用率較低,偶爾做下緩存任務時會高些。

細心的朋友可能看出上圖就是使用StackOverflow開源的Opserver所采集的數據。

.NET應用程序性能優化

TOF系統屬於高並發的系統,使用系統默認的配置是不行的,需要對操作系統和.NET框架做優化:

  • Windows優化:調整tcp連接數,保證系統層面保證服務的不受限於操作系統,調整操作系統的TCP/IP參數,比如把Time_Wait 時間窗口2分鍾à45秒,可用的端口數調整到65535,默認才5024個,對一個大並發的系統來說遠遠不夠。

  • Web服務器優化:根據服務器的CPU核數調整進程數和HTTP層相關配置。

  • WCF框架的參數優化:

  1. 采取NETTCP綁定,保證框架通信的高效率

  2.  序列化:xml -> rest\json ->protobuf,適配器模式,使用protobuf替代wcf默認的二進制序列化,這里就可以6倍的性能提升。

  3.  根據服務流量調整WCF流量限制配置的值  

 

  總體來說,TOF整體架構並沒有采用那些非常高端的技術,使用的都是非常普通的.NET技術,混合使用Windows/Linux和開源技術照樣可以打造高性能高並發的應用系統。 

 

相關文章:


免責聲明!

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



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