thrift幾種server模式的比較

五、  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就可以。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章