天天看點

Dubbo 線程模型兩種線程IO線程的派發政策業務線程池設定

兩種線程

  • IO線程:配置在netty連接配接點的用于處理網絡資料的線程,主要處理編解碼等直接與網絡資料打交道的事件。
  • 業務線程:用于處理具體業務邏輯的線程,可以了解為自己在provider上寫的代碼所執行的線程環境。

Dubbo 預設采用的是長連接配接的方式,即預設情況下一個consumer和一個provider之間隻會建立一條連結,這種情況下:

IO線程的工作就是編碼和解碼資料,監聽具體的資料請求,直接通過Channel釋出資料等等;

業務線程就是處理IO線程處理之後的資料,業務線程并不知道任何跟網絡相關的内容,隻是純粹的處理業務邏輯,在業務處理邏輯的時候往往存在複雜的邏輯,是以業務線程池的配置往往都要比IO線程池的配置大很多。

IO線程部分,Netty服務提供方NettyServer又使用了兩級線程池,master主要用來接受用戶端的連接配接請求,并把接受的請求分發給worker來處理。整個過程如下圖:

Dubbo 線程模型兩種線程IO線程的派發政策業務線程池設定

IO線程的派發政策

  • all(預設):所有消息都派發到線程池,包括請求,響應,連接配接事件,斷開事件,心跳等。即worker線程接收到事件後,将該事件送出到業務線程池中,自己再去處理其他IO事件。
  • direct:worker 線程接收到事件後,由 worker (IO線程)執行到底。
  • message:隻有請求響應消息派發到線程池,其它連接配接斷開事件,心跳等消息,直接在IO線程上執行。
  • execution:隻有請求消息派發到線程池,不含響應(用戶端線程池),響應和其它連接配接斷開事件,心跳等消息,直接在IO線程上執行。
  • connection:在IO線程上,将連接配接斷開事件放入隊列,有序逐個執行,其它消息派發到線程池。

業務線程池設定

  • fixed:固定大小線程池,啟動時建立線程,不關閉,一直持有。(預設)

    coresize:200

    maxsize:200

    隊列:SynchronousQueue

    回絕政策:AbortPolicyWithReport-列印線程資訊jstack,之後抛出異常

  • cached:緩存線程池,空閑一分鐘自動删除,需要時重建。
  • limited:可伸縮線程池,但池中的線程數隻會增長不會收縮。隻增長不收縮的目的是為了避免收縮時突然來了大流量引起的性能問題。

配置示例:

<dubbo:protocol name="dubbo"dispatcher="a11"threadpool="fixed"threads="100"/>

繼續閱讀