講到並發處理,我們一般會分為兩個方面來說:a)伺服器層級的並發控制; b)程式層級的並發控制。
伺服器層級的並發控制:
Ø 調整伺服器應用程式池中的最大串連數。
對於Web 服務器,dudu在最佳化部落格園的伺服器的時候寫過以下的文章。
dudu 寫過讓Windows Server 2008+IIS 7+ASP.NET支援10萬個同時請求http://www.cnblogs.com/dudu/archive/2009/11/10/1600062.html
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。
<configuration>
<system.web>
<processModel requestQueueLimit="100000"/>
4. 修改註冊表,調整IIS 7支援的同時TCPIP串連數
由原來的預設5000改為100000。
reg add HKLM\System\CurrentControlSet\Services\HTTP\Parameters /v MaxConnections /t REG_DWORD /d 1000000
完成上述4個設定,就可以支援10萬個同時請求
Ø 對於DB伺服器同樣也可以調整最大串連數來做最佳化。
在調整最佳化好最大串連數之後,就只有軟硬體負載平衡了。硬體負載平衡能夠直接通過智能交換器實現,處理能力強,而且與系統無關,但是價格貴,配置困難,不能區分實習系統與應用的狀態。所以硬體負載平衡適用於一大堆裝置,大訪問量,簡單應用。軟體負載平衡是基於系統與應用的,能過更好地根據系統與應用的狀況來分配負載。性價比高。PCL負載平衡軟體,Linux下的LVS軟體。
程式層級的並發控制:
當兩個使用者同時訪問一個頁面,一個使用者可能更新的事另一個使用者已經刪除的記錄。或者,在一個使用者載入頁面跟他點擊刪除按鈕之間的時間裡,另一個使用者修改了這條記錄的內容。
有下面三中並發控制策略可供選擇:
Ø 什麼都不做 –如果並發使用者修改的是同一條記錄,讓最後提交的結果生效(預設的行為)
Ø 開放式並發(Optimistic Concurrency) - 假定並發衝突只是偶爾發生,絕大多數的時候並不會出現; 那麼,當發生一個衝突時,僅僅簡單的告知使用者,他所作的更改不能儲存,因為別的使用者已經修改了同一條記錄
Ø 保守式並發(Pessimistic Concurrency) – 假定並發衝突經常發生,並且使用者不能容忍被告知自己的修改不能儲存是由於別人的並發行為;那麼,當一個使用者開始編輯一條記錄,鎖定該記錄,從而防止其他使用者編輯或刪除該記錄,直到他完成並提交自己的更改