asp.net解決高並發的方案

來源:互聯網
上載者:User

標籤:周期性   section   ase   sys   性價比高   測試   差集   刪除   adr   

通過伺服器處理高並發

 調整伺服器應用程式池中的最大串連數。

1. 調整IIS 7應用程式集區隊列長度

由原來的預設1000改為65535。

IIS Manager > ApplicationPools > Advanced Settings

Queue Length : 65535

2.  調整IIS 7的appConcurrentRequestLimit設定

由原來的預設5000改為100000。

appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000

在%systemroot%/System32/inetsrv/config/applicationHost.config中可以查看到該設定。

3. 調整machine.config中的processModel>requestQueueLimit的設定

由原來的預設5000改為100000。



4. 修改註冊表,調整IIS 7支援的同時TCPIP串連數

由原來的預設5000改為100000。

reg add HKLM/System/CurrentControlSet/Services/HTTP/Parameters /v MaxConnections /t REG_DWORD /d 1000000 

完成上述4個設定,就可以支援10萬個同時請求

參見http://www.cnblogs.com/dudu/archive/2009/11/10/1600062.html

  對於DB伺服器同樣也可以調整最大串連數來做最佳化。

      在調整最佳化好最大串連數之後,就只有軟硬體負載平衡了。硬體負載平衡能夠直接通過智能交換器實現,處理能力強,而且與系統無關,但是價格貴,配置困難,不 能區分實習系統與應用的狀態。所以硬體負載平衡適用於一大堆裝置,大訪問量,簡單應用。軟體負載平衡是基於系統與應用的,能過更好地根據系統與應用的狀況 來分配負載。性價比高。PCL負載平衡軟體,Linux下的LVS軟體。

程式層級的並發控制:

當兩個使用者同時訪問一個頁面,一個使用者可能更新的事另一個使用者已經刪除的記錄。或者,在一個使用者載入頁面跟他點擊刪除按鈕之間的時間裡,另一個使用者修改了這條記錄的內容。

ADO.NET 和 Visual Studio .NET 中的並發控制

因為資料結構基於斷開的資料,所以 ADO.NET 和 Visual Studio .NET 使用開放式並發。因此,您需要添加商務邏輯,以利用開放式並發解決問題。

如果您選擇使用開放式並發,則可以通過兩種常規的方法來確定是否已發生更改:版本方法(實際版本號碼或日期時間戳記)和儲存所有值方法。

版本號碼方法

在版本號碼方法中,要更新的記錄必須具有一個包含日期時間戳記或版本號碼的列。當讀取該記錄時,日期時間戳記或版本號碼將儲存在用戶端。然後,將對該值進行部分更新。

處理並發的一種方法是僅當 WHERE 子句中的值與記錄上的值匹配時才進行更新。該方法的 SQL 表示形式為:

UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2WHERE DateTimeStamp = @origDateTimeStamp

或者,可以使用版本號碼進行比較:

UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2WHERE RowVersion = @origRowVersionValue

如果日期時間戳記或版本號碼匹配,則表明資料存放區區中的記錄未被更改,並且可以安全地使用資料集中的新值對該記錄進行更新。如果不匹配,則將返回錯誤。 您可以編寫代碼,在 Visual Studio .NET 中實現這種形式的並發檢查。您還必須編寫代碼來響應任何更新衝突。為了確保日期時間戳記或版本號碼的準確性,您需要在表上設定觸發器,以便在發生對行的更改 時,對日期時間戳記或版本號碼進行更新。

儲存所有值方法

使用日期時間戳記或版本號碼的替代方法是在讀取記錄時擷取所有欄位的副本。ADO.NET 中的 DataSet 對象維護每個修改記錄的兩個版本:初始版本(最初從資料來源中讀取的版本)和修改版本(表示使用者更新)。當試圖將記錄寫回資料來源時,資料行中的初始值將與數 據源中的記錄進行比較。如果它們匹配,則表明資料庫記錄在被讀取後尚未經過更改。在這種情況下,資料集中已更改的值將成功地寫入資料庫。

對於資料配接器的四個命令(DELETE、INSERT、SELECT 和 UPDATE)來說,每個命令都有一個參數集合。每個命令都有用於初始值和當前值(或修改值)的參數。

注意    由於不存在初始記錄,添加新記錄(INSERT 命令)只需要當前值;移除記錄(DELETE 命令)只需要使用初始值來定位要刪除的記錄。

以下樣本顯示一個資料集命令的命令文本,該命令更新一個典型的客戶表。該命令是為動態 SQL 和開放式並發而指定的。

UPDATE Customers SET CustomerID = @currCustomerID, CompanyName = @currCompanyName, ContactName = @currContactName,ContactTitle = currContactTitle, Address = @currAddress, City = @currCity,PostalCode = @currPostalCode, Phone = @currPhone, Fax = @currFaxWHERE (CustomerID = @origCustomerID) AND (Address = @origAddress OR @origAddress IS NULL AND Address IS NULL) AND (City = @origCity OR @origCity IS NULL AND City IS NULL)AND (CompanyName = @origCompanyName OR @origCompanyName IS NULL AND CompanyName IS NULL) AND (ContactName = @origContactName OR @origContactName IS NULL AND ContactName IS NULL) AND (ContactTitle = @origContactTitle OR @origContactTitle IS NULL AND ContactTitle IS NULL)AND (Fax = @origFax OR @origFax IS NULL AND Fax IS NULL) AND (Phone = @origPhone OR @origPhone IS NULL AND Phone IS NULL) AND (PostalCode = @origPostalCode OR @origPostalCode IS NULL AND PostalCode IS NULL);SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, City,PostalCode, Phone, FaxFROM Customers WHERE (CustomerID = @currCustomerID)

請注意,九個 SET 語句參數表示將寫入資料庫的當前值,而九個 WHERE 語句參數則表示用於定位初始記錄的初始值。

前九個 SET 語句參數對應於參數集合中的前九個參數。這些參數會將其 SourceVersion 屬性設定為 Current

接著的九個 WHERE 語句參數用於開放式並發。這些預留位置對應於參數集合中接著的九個參數,這些參數的每一個都將其 SourceVersion 屬性設定為 Original

SELECT 語句用於在發生更新後重新整理資料集。它是您在“進階 SQL 產生選項”對話方塊中設定“重新整理資料集”選項時產生的。

注意    上面的 SQL 使用具名引數,而  OleDbDataAdapter 命令則使用問號 (?) 作為參數預留位置。

預設情況下,如果您在“資料配接器設定精靈”中選擇“開放式並發”選項,Visual Studio 將為您建立這些參數。此時將由您根據自己的業務要求來添加錯誤處理代碼。ADO.NET 提供了一個 DBConcurrencyException 對象,它返回違反並發規則的行。有關更多資訊,請參見處理並發錯誤。

 

通過程式處理高並發

第一,緩衝。

System.Web.Caching.Cache緩衝  http://www.cnblogs.com/daizhj/archive/2007/08/15/855163.html

Memcached分布式緩衝 http://www.cnblogs.com/daizhj/archive/2009/03/23/1386652.html

緩衝分層(本機快取+Memcached) http://www.cnblogs.com/daizhj/archive/2009/11/17/1604436.html

Redis架構設計 http://www.cnblogs.com/daizhj/archive/2011/02/21/1959511.html

LLServer架構設計 http://www.cnblogs.com/daizhj/archive/2011/08/26/discuznt_llserver_arch.html

跨站緩衝同步 http://www.cnblogs.com/daizhj/archive/2010/06/18/discuznt_memcache_syncdata.html

 

小貼士

Memcached是danga.com(運營LiveJournal的技術團隊)開發的一套分布式記憶體對象緩衝系統,用於在動態系統中減少資料庫負載,提升效能。具體的介紹可以參考:

Memcached深度分析
http://www.cnblogs.com/luluping/archive/2009/01/14/1375456.html

Redis
redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value類型相對更多,包括string(字串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(雜湊類型)。這些資料類型都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是緩衝在記憶體中。區別的是redis會周期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。

http://doc.redisfans.com/

http://www.cnblogs.com/shanyou/archive/2012/01/28/2330451.html

 

第二,靜態檔案分開布置

1.將使用者上傳的附件通過FTP方式傳送到另外一台伺服器上。http://www.cnblogs.com/daizhj/archive/2008/07/28/1254648.html

2.通過SQUID將靜態檔案快取分布
使用SQUID做靜態前端,將論壇中的大部分靜態檔案布署或外鏈到一個新的HTTP連結上,從而給Web伺服器減壓,提升效能。

http://www.cnblogs.com/daizhj/archive/2010/06/10/1692758.html

 

第三,負載平衡

 

通過以上的方案,Web伺服器壓力小了,效能也提升了,但是如果遇到更高的並發訪問量,單台Web伺服器還是不能滿足需求,可以採取負載平衡的方案。

使用了LVS+KEEPALIVED、NGINX等。相關文章如下:

 

 

 

    Discuz!NT負載平衡解決方案(HA)之---LVS(Linux Virtual Server)
    http://www.cnblogs.com/daizhj/archive/2010/06/13/1693673.html

 

 

 

    Discuz!NT負載平衡解決方案(HA)之---LVS(Linux Virtual Server)

 

    http://www.cnblogs.com/daizhj/archive/2010/06/13/1693673.html

 

 

 

    Discuz!NT負載平衡方案

 

    http://www.cnblogs.com/daizhj/archive/2010/06/24/1667422.html

 

 

 

    使用的是nginx,使用nginx作為前端負載平衡,這個確實很有吸引力,有時間能試用下就好。

 

第四,緩解資料庫壓力

           Discuz!NT資料庫讀寫分離方案

    http://www.cnblogs.com/daizhj/archive/2010/06/21/dbsnap_master_slave_database.html

    全文檢索搜尋方案:

    Discuz!NT企業版之Sphinx全文檢索搜尋(上)

    http://www.cnblogs.com/daizhj/archive/2010/06/28/discuznt_entlib_sphinx_one.html

 

     Discuz!NT企業版之Sphinx全文檢索搜尋(下)

    http://www.cnblogs.com/daizhj/archive/2010/06/30/discuznt_entlib_sphinx_two.html

 

    處理大資料量:

    Discuz!NT千萬級資料量上的兩駕馬車--TokyoCabinet,MongoDB

    http://www.cnblogs.com/daizhj/archive/2010/07/22/1781140.html

 

 

需要掌握的知識

Memcached、Redis、LLServer、SQUID、NGINX、LVS、Sphinx

有windows版本的,也有linux版本。

 

 

 

沒有先後,程式員應該根據需要和當下條件選用。

 

 

 

本地測試高並發的工具

測試方法:
本地類比測試網站高訪問高並發採用的測試載入器是大名鼎鼎的Loadrunner,這個工具做測試的一般都知道。在代震軍的部落格中,有以下幾篇介紹了通過Loadrunner進行壓力並發測試。

當DiscuzNT遇上了Loadrunner(上)
http://www.cnblogs.com/daizhj/archive/2009/09/25/1573926.html

當DiscuzNT遇上了Loadrunner(中) 
http://www.cnblogs.com/daizhj/archive/2009/09/27/1574897.html

當DiscuzNT遇上了Loadrunner(下) 
http://www.cnblogs.com/daizhj/archive/2009/09/27/1575091.html

 

 

來源:http://www.blogs8.cn/posts/Eqcuff9

asp.net解決高並發的方案

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.