由淺入深瞭解Thrift(三)——Thrift server端的幾種工作模式分析
http://blog.csdn.net/houjixin/article/details/42779915
五、 Thrift伺服器端幾種工作模式分析與總結
Thrift為伺服器端提供了多種工作模式,本文中將涉及以下5中工作模式:TSimpleServer、TNonblockingServer、THsHaServer、TThreadPoolServer、TThreadedSelectorServer,這5中工作模式的詳細工作原理如下:
1. TSimpleServer模式
TSimpleServer的工作模式只有一個工作執行緒,迴圈監聽新請求的到來並完成對請求的處理,它只是在簡單的演示時候使用,它的工作方式如圖5.1所示:
圖5.1 TSimpleServer的工作模式
TSimpleServer的工作模式採用最簡單的阻塞IO,實現方法簡潔明瞭,便於理解,但是一次只能接收和處理一個socket連線,效率比較低,主要用於演示Thrift的工作過程,在實際開發過程中很少用到它。
2. TNonblockingServer模式
TNonblockingServer工作模式,該模式也是單執行緒工作,但是該模式採用NIO的方式,所有的socket都被註冊到selector中,在一個執行緒中通過seletor迴圈監控所有的socket,每次selector結束時,處理所有的處於就緒狀態的socket,對於有資料到來的socket進行資料讀取操作,對於有資料傳送的socket則進行資料傳送,對於監聽socket則產生一個新業務socket並將其註冊到selector中,如下圖5.2所示:
圖5.2、TNonblockingServer工作模式
上圖5.2中讀取資料之後的業務處理就是根據讀取到的呼叫請求,呼叫具體函式完成處理,只有完成函式處理才能進行後續的操作;
TNonblockingServer模式優點:
相比於TSimpleServer效率提升主要體現在IO多路複用上,TNonblockingServer採用非阻塞IO,同時監控多個socket的狀態變化;
TNonblockingServer模式缺點:
TNonblockingServer模式在業務處理上還是採用單執行緒順序來完成,在業務處理比較複雜、耗時的時候,例如某些介面函式需要讀取資料庫執行時間較長,此時該模式效率也不高,因為多個呼叫請求任務依然是順序一個接一個執行。
3. THsHaServer模式(半同步半非同步)
THsHaServer類是TNonblockingServer類的子類,在5.2節中的TNonblockingServer模式中,採用一個執行緒來完成對所有socket的監聽和業務處理,造成了效率的低下,THsHaServer模式的引入則是部分解決了這些問題。THsHaServer模式中,引入一個執行緒池來專門進行業務處理,如下圖5.3所示;
圖5.3 THsHaServer模式
THsHaServer的優點:
與TNonblockingServer模式相比,THsHaServer在完成資料讀取之後,將業務處理過程交由一個執行緒池來完成,主執行緒直接返回進行下一次迴圈操作,效率大大提升;
THsHaServer的缺點:
由圖5.3可以看出,主執行緒需要完成對所有socket的監聽以及資料讀寫的工作,當併發請求數較大時,且傳送資料量較多時,監聽socket上新連線請求不能被及時接受。
4. TThreadPoolServer模式
TThreadPoolServer模式採用阻塞socket方式工作,,主執行緒負責阻塞式監聽“監聽socket”中是否有新socket到來,業務處理交由一個執行緒池來處理,如下圖5.4所示:
圖5.4 執行緒池模式工作過程
TThreadPoolServer模式優點:
執行緒池模式中,資料讀取和業務處理都交由執行緒池完成,主執行緒只負責監聽新連線,因此在併發量較大時新連線也能夠被及時接受。執行緒池模式比較適合伺服器端能預知最多有多少個客戶端併發的情況,這時每個請求都能被業務執行緒池及時處理,效能也非常高。
TThreadPoolServer模式缺點:
執行緒池模式的處理能力受限於執行緒池的工作能力,當併發請求數大於執行緒池中的執行緒數時,新請求也只能排隊等待。
5. TThreadedSelectorServer
TThreadedSelectorServer模式是目前Thrift提供的最高階的模式,它內部有如果幾個部分構成:
(1) 一個AcceptThread執行緒物件,專門用於處理監聽socket上的新連線;
(2) 若干個SelectorThread物件專門用於處理業務socket的網路I/O操作,所有網路資料的讀寫均是有這些執行緒來完成;
(3) 一個負載均衡器SelectorThreadLoadBalancer物件,主要用於AcceptThread執行緒接收到一個新socket連線請求時,決定將這個新連線請求分配給哪個SelectorThread執行緒。
(4) 一個ExecutorService型別的工作執行緒池,在SelectorThread執行緒中,監聽到有業務socket中有呼叫請求過來,則將請求讀取之後,交個ExecutorService執行緒池中的執行緒完成此次呼叫的具體執行;
圖5.5 TThreadedSelectorServer模式的工作過程
如上圖5.5所示,TThreadedSelectorServer模式中有一個專門的執行緒AcceptThread用於處理新連線請求,因此能夠及時響應大量併發連線請求;另外它將網路I/O操作分散到多個SelectorThread執行緒中來完成,因此能夠快速對網路I/O進行讀寫操作,能夠很好地應對網路I/O較多的情況;TThreadedSelectorServer對於大部分應用場景效能都不會差,因此,如果實在不知道選擇哪種工作模式,使用TThreadedSelectorServer就可以。