天天看點

Dubbo學習筆記(三) RPC核心原理和線程模型

在幾個典型的RPC使用場景中,包含服務發現,負載均衡,容錯,透明,序列化,網絡傳輸等子產品.其中RPC協定就是核心子產品,主要包括序列化,網絡傳輸.隻要RPC協定實作了,就可以進行遠端調用,其他的負載,容錯,透明,注冊發現都是對RPC調用的優化,使他更加穩定健壯.

圖解RPC原理

Dubbo學習筆記(三) RPC核心原理和線程模型

圖解:

用戶端通過調用子產品,找到服務發現,擷取服務位址,之後進行負載均衡,容錯等執行RPC協定過程, 經過網絡傳輸,反序列化 擷取調用的服務接口. 再通過線程池,對真實服務進行調用, 線程傳回結果,之後再經過網絡 把結果回報回來.這裡RPC協定的過程是IO線程,業務邏輯的執行是業務線程,通過線程池進行解耦,避免了IO線程被服務線程拖垮.提高效率,類似于TOMCAT,IO線程和工作線程.

線程模型

如果事件處理的邏輯能迅速完成,并且不會發起新的 IO 請求,比如隻是在記憶體中記個辨別,則直接在 IO 線程上處理更快,因為減少了線程池排程。

但如果事件處理邏輯較慢,或者需要發起新的 IO 請求,比如需要查詢資料庫,則必須派發到線程池,否則 IO 線程阻塞,将導緻不能接收其它請求。

如果用 IO 線程處理事件,又在事件處理過程中發起新的 IO 請求,比如在連接配接事件中發起登入請求,會報“可能引發死鎖”異常,但不會真死鎖。

是以,需要通過不同的派發政策和不同的線程池配置的組合來應對不同的場景:

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

重點: 這是配置的 協定 協定有個名字 檢視 配置裡面發現 裡面有個

protocol 屬性,可以引用配置好的協定,并且可以引用多協定. 多協定使用逗号分隔.

Dispatcher

all 所有消息都派發到線程池,包括請求,響應,連接配接事件,斷開事件,心跳等。

direct 所有消息都不派發到線程池,全部在 IO 線程上直接執行。

message 隻有請求響應消息派發到線程池,其它連接配接斷開事件,心跳等消息,直接在 IO 線程上執行。

execution 隻請求消息派發到線程池,不含響應,響應和其它連接配接斷開事件,心跳等消息,直接在 IO 線程上執行。

connection 在 IO 線程上,将連接配接斷開事件放入隊列,有序逐個執行,其它消息派發到線程池。

ThreadPool

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

cached 緩存線程池,空閑一分鐘自動删除,需要時重建。

limited 可伸縮線程池,但池中的線程數隻會增長不會收縮。隻增長不收縮的目的是為了避免收縮時突然來了大流量引起的性能問題。