池(網路技術名稱)

本詞條是多義詞,共3個義項
更多義項 ▼ 收起列表 ▲

池,即Pool(池),網路技術名稱,套用在伺服器端軟體的開發上。

基本介紹

  • 中文名:池
  • 概念:在伺服器端軟體的開發上
  • 資源池:資源放置於記憶體對象中以備使用
  • 分析:中出現的所有實體
池,資源池,執行緒池,

池的描述和定義:Pool(池)的概念被廣泛的套用在伺服器端軟體的開發上。使用池結構可以明顯的提高你的應用程式的速度,改善效率和降低系統資源的開銷。所以在現在的套用伺服器端的開發中池的設計和實現是開發工作中的重要一環。那么到底什麼是池呢?我們可以簡單的想像一下套用運行時的環境,當大量的客戶並發的訪問套用伺服器時我們如何提供服務呢?我們可以為每一個客戶提供一個新的服務對象進行服務這種方法看起來簡單,在實際套用中如果採用這種實現會有很多問題,顯而易見的是不斷的創建和銷毀新服務對象必將給造成系統資源的巨大開銷,導致系統的性能下降。針對這個問題我們採用池的方式。池可以想像成就是一個容器保存著各種我們需要的對象。我們對這些對象進行復用,從而提高系統性能。從結構上看,它應該具有容器對象和具體的元素對象。從使用方法上看,我們可以直接取得池中的元素來用,也可以把我們要做的任務交給它處理。所以從目的上看池應該有兩種類型,一種是用於處理客戶提交的任務的,我們通常用Thread Pool(執行緒池)來描述它,另一種是客戶從池中獲取有關的對象進行使用,我們通常用 Resource Pool(資源池)來描述它。它們可以分別解決不同的問題。以下結合具體的套用進行介紹。

資源池

首先介紹資源池(有時也可以叫做對象池)資源池可以維護多種可以重用的資源。資源池最基本的思想就是預先建立一些資源放置於記憶體對象中以備使用,例如Socket連線,JDBC連線,CORBA 對象 tuxedo連線等等。舉一個簡單的WEB數據查詢的例子,用戶通過伺服器建立一個JDBC連線,然後查詢,最後關閉。如果用戶量比較大那么對JDBC的連線管理就自然會成為套用瓶頸。
採用資源池可以用來在多個客戶訪問時提供對共享資源的管理機制。當一個客戶訪問一種指定類型的資源時,伺服器不是簡單的分配給客戶新的資源而是從池中取得已經實例化的資源對象為它服務。
分析
首先我們分析一下這個問題中出現的所有實體,通過分析他們的共性來設計統一的接口。
我們可以得到一個ConnManger對象,通過它提供對多個Pool對象的創建和管理和為客戶提供對資源的存取方法。一個採用特定的數據結構實現的Pool 對象用於存取指定類型的資源對象。對各種資源對象的抽象描述接口IpoolItem。所有需要重用的資源對象都要實現這個接口。
通過這三個基本的類和他們的方法,就可以實現一個簡單的資源池。下面我們進一步對它們進行改動,增加一些更有效的管理方法。
改進
錯誤恢復:在資源池中最常見的問題時如何處理出現異常的資源對象。池的實現必須提供完整的機制進行資源的保護,資源對象為什麼會出現異常呢,讓我們分析一下一個多客戶的伺服器程式可能出現的問題。一個資源在長時間使用後,連線可能發生了逾時;數據服務的進程可能發生了退出;網路可能中斷等等。那么這個資源對象的狀態就會相應的中斷,使用這個資源的客戶端就會發生異常,而且我們要求客戶端在使用完資源後把這個資源放回池中,所以這一定會影響其他客戶對資源的訪問,進一步使情況惡化,如果不對這種狀況進行處理,很有可能池中的所有資源都會變成不可用,從而伺服器無法提供服務。我們必須提供一種方式使池可以處理髮生故障的資源對象。而不是簡單的把對象放回池中。所以我們對ConnManager和Pool對象提供新的方法repairConnection()和fixConnection();使客戶端在發現資源異常時可以使用這個方法通知池恢復出錯的資源對象。動態管理:在系統的運行時客戶的請求數量往往是一種具有波峰和波谷的曲線,所以我們希望在系統允許的範圍內,提供對池的動態管理簡單的說就是在峰值請求時池會動態的調整加大池的尺寸提供更多的可供使用的資源;波谷時減小池的尺寸進行資源的回收。考慮到這個目的,所以為Pool對象增加一個後台運行的監視執行緒在池對象創建後,按照一定的算法進行檢測Pool對象的運行狀態,實現動態調整的功能。補充說明一點如果Pool對象的內部數據結構的不同,可以提供更為豐富的管理機制。統一的接口。ConnManger對池對象的創建採用從配置檔案中讀取配置信息的方式,動態的載入特定的PoolItem實例到相應的Pool對象中。從而可以保證池的多元性。

執行緒池

前面已經提到了很多的套用伺服器,都需要處理從客戶端發起的任務請求,這些任務往往具有高密度,短時間的特性,無論通過什麼方式在伺服器得到client 請求後,伺服器就需要獨立的處理這個客戶請求。針對這個的問題,執行緒池提供了處理系統性能和大用戶量請求之間的矛盾的方法,通過對多個任務重用已經存在的執行緒對象,降低了對執行緒對象創建和銷毀的開銷,由於當客戶請求到了時,執行緒對象已經存在,可以提高請求的回響時間從而整體的提高了系統服務的表現。
下面給出一個執行緒池的簡單設計樣例(參見圖2)
分析
在這個環境中,我們必須注意到一個問題就是執行緒的邏輯和套用的任務邏輯的分離,不能把用戶的套用邏輯固化到執行緒池的實現中。如果沒有達到這個目標那么這個執行緒池的實現是有一定的局限性的。為了實現這一點,必須對執行緒池的運行邏輯進行抽象通過一個任務的抽象接口來模擬客戶提交的任務。
一個ThreadPool對象,它管理和創建可重用的執行緒對象TaskRunable,通過runTask方法接受客戶提交的任務,並選擇可以使用的執行緒對象調用它的getTaks方法使其執行任務。執行緒池中重用的執行緒對象 TaskRunnable。它是一個獨立的執行緒對象,通過getTask方法執行由所在容器ThreadPool傳遞的任務。任務對象接口Itask。所以的客戶任務都必須實現這個接口,從而保證執行緒邏輯和套用邏輯的分離。
改進
錯誤恢復:在TaskRunable對象中必須時刻監視thread對象的運行狀況,如果發生錯誤,必須通知ThreadPool 對象進行相應的處理保證所有的TaskRunable對象的運行正常,因此添加notfiyThreadCrash方法。動態管理:我們可以參照資源池的實現同樣提供一個監視執行緒Monitor管理ThreadPool對象的運行狀態,實現Pool的動態管理。

相關詞條

熱門詞條

聯絡我們