性能分布式NewLife.XCode对无限数据的支持
? ?上周發布了《改進版CodeTimer及XCode性能測試》,展示了NewLife.XCode在性能上的表現。實際上NewLife.XCode是一個很平凡的ORM,只是在分頁和緩存方面多下點功夫,注意每一個細節,才能保證在數據量大、業務繁忙的環境中得以保持良好的性能。
??? NewLife.XCode所經歷過的比較忙的一個系統是一個網吧行業的核心系統,為五千家網吧,一百萬客戶端提供服務,每天大概有十幾萬會員多次登錄客戶端。當然這一百萬客戶端不可能同時全部登錄。因為業務需要,每個客戶端每隔一段時間(幾秒)Ping一次服務端,刷新在線記錄。只有一臺服務器運行服務端,windows2003,雙核CPU,4G內存,自組裝共花費7kRMB。因為擔心TCP鏈接數限制,沒有采用TCP通訊,而直接使用WebService+IIS。開了三四個IIS站點,緩存全開的情況下,每個進程占用200M到500M內存。數據庫是windows2008R2+MSSQL2008,四核CPU,32G內存,自組裝共花費14kRMB,MSSQL進程占了10G多內存。
??? 這次的主角是一位個人站長使用NewLife.XCode做的系統(采集+整理+網站),我們先看現狀
服務器配置(國外,64位平臺,2G內存少了些)
網站建立時間:20天
每日訪問量:14000IP? 12000PV
IIS CPU:0(因為網站的緩存命中率極高)
IIS 內存:200,000k * 3(3個進程)
MSSQL
CPU:0(數據整理子系統寫入,網站讀取)
內存:500,000k
重要表個數:400(表結構一致,因為數據量大才分表)
重要表數據量:20,000,000(20M*400=8B?80億?)
數據增長速度:每2小時1萬條
SQLite
重要表個數:7
重要表數據量:20,000,000
數據增長速度:每1小時2萬條
?
??? 1,采集子系統,采集到的數據寫入一個SQLite,采集過程中也需要查詢
??? 2,數據整理子系統,分析整理SQLite中的數據,歸檔到MSSQL中
??? 3,網站根據用戶的查詢,讀取MSSQL中的數據來展現
?
??? 這個系統是個什么樣的規模?昨天站長告訴我,截止下午四點,當天廣告收人173刀。
??? 現在才不到一個月,數據還是很少的。站長所苦惱的地方在于:如何存儲這些會無限增長的數據?
?
??? 以下是站長目前使用的手段:
??? 1,拆分表。XCode有個武藝(詳見《充血模型的ORM能做什么?——ORM組件XCode(十八般武藝)》),可以動態改變實體類所映射的表名。于是根據數據類別來分表,重載實體類的數據操作方法,查詢和寫入前,根據當前數據類別計算表名并修改,實現了一個實體類對應多個相同結構的數據表。并且,如果該名稱的數據表不存在,XCode的反向工程會自動創建。使用者一點都不用關心,上層使用代碼就跟使用單表一樣。
??? 2,采集和網站數據庫分離,開始的時候采集也是寫入MSSQL,顯然,這會讓MSSQL變得很忙,并且會帶來因采集而導致網站不正常的風險。
??? 3,緩存。網站對數據的實時性要求不高,采集而來的數據,可以在一兩個小時之后才反映到網站上來。因此,網站打開一級緩存,緩存時間可以設置為1小時。一級緩存這里不能設為永久,否則就再也拿不到采集到的新數據了,除非進程重啟。期間也遇到緩存經常失效的問題,經查是IIS應用程序池回收所致,設為固定時間回收就可以了。
static void TestLog() {NewLog log = new NewLog();log.Action = "Test";log.Category = "SystemLog";log.Save();log = new NewLog();log.Action = "Test";log.Category = "UserLog";log.Save(); } class NewLog : Log<NewLog> {public override int Insert(){Meta.TableName = Category;return base.Insert();} }
??? 這么做,幾千張表,每張表兩千萬的數據,應該是沒有問題的了。
??? 當然,這其中還是有一些問題的
??? 1,SQLite寫入頻繁,偶爾發生多線程沖突,XCode中的SQLite提供者增加了失敗重試機制,降低了沖突幾率,大概萬分之一
??? 2,SQLite數據增長過快,顯然,這個問題很嚴重,但也不是不能解決,XCode除了能動態改變表名,還能動態改變連接名,也就是說,跟拆分表一樣,能夠輕易的實現拆分庫。
??? 3,拆分庫又會帶來IO的問題,這個時候,只能使用更多的數據庫服務器。
??? 4,如果網站使用的MSSQL成為瓶頸怎么辦?可以使用多個MSSQL服務器,假如10個,配置文件中配置10個對應的連接字符串,重載實體類的查詢方法,查詢之前動態修改連接名。至于該使用哪一個連接名,就看自己實現的算法了,最簡單的就是輪詢或者隨機。這樣子就很輕易的實現了簡單的分布式。新版本內置了分布式的提供者,可以根據權重隨機分發查詢,還可以把數據同時寫入到多個目標數據庫中去,而這些,都不需要修改業務實現代碼。
?
??? 不要怪我們狠(臃腫?),因為我們是充血模型!
?
??? http://xcode.codeplex.com/
我不相信神話,我只相信汗水!我不相信命運,我只相信雙手! 分類: X組件本文轉自大石頭博客園博客,原文鏈接:http://www.cnblogs.com/nnhy/archive/2011/03/21/XCode_Distributed.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的性能分布式NewLife.XCode对无限数据的支持的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux系统开发环境配置
- 下一篇: MySQL常用数据类型小结