轉(zhuǎn)自? https://ifeve.com/dubbo-threadmodel/
Dubbo剖析-線(xiàn)程模型
一铝侵、前言
Dubbo默認(rèn)的底層網(wǎng)絡(luò)通訊是使用Netty來(lái)做的,在服務(wù)提供方NettyServer使用兩級(jí)線(xiàn)程池秩贰,其中
EventLoopGroup(boss)主要用來(lái)接受客戶(hù)端的鏈接請(qǐng)求,并把接受的請(qǐng)求分發(fā)給EventLoopGroup(worker)來(lái)處
理,boss和worker線(xiàn)程組我們稱(chēng)為IO線(xiàn)程力穗。
如果服務(wù)提供方的邏輯能迅速完成拷橘,并且不會(huì)發(fā)起新的 IO 請(qǐng)求局义,則直接在 IO 線(xiàn)程上處理更快,因?yàn)檫@減少了線(xiàn)程池調(diào)度冗疮。
但如果處理邏輯較慢萄唇,或者需要發(fā)起新的 IO 請(qǐng)求,比如需要查詢(xún)數(shù)據(jù)庫(kù)术幔,則必須派發(fā)到新線(xiàn)程池另萤,否則 IO 線(xiàn)程阻塞,將導(dǎo)致不能接收其它請(qǐng)求诅挑。
二四敞、Dubbo提供的線(xiàn)程模型
all 所有消息都派發(fā)到線(xiàn)程池,包括請(qǐng)求揍障,響應(yīng)目养,連接事件,斷開(kāi)事件毒嫡,心跳等,模型如下圖
direct 所有消息都不派發(fā)到線(xiàn)程池癌蚁,全部在 IO 線(xiàn)程上直接執(zhí)行,模型如下圖
execution 只請(qǐng)求消息派發(fā)到線(xiàn)程池兜畸,不含響應(yīng)努释,響應(yīng)和其它連接斷開(kāi)事件,心跳等消息咬摇,直接在 IO 線(xiàn)程上執(zhí)行伐蒂,模型如下圖
connection 在 IO 線(xiàn)程上,將連接斷開(kāi)事件放入隊(duì)列肛鹏,有序逐個(gè)執(zhí)行逸邦,其它消息派發(fā)到線(xiàn)程池。
其中ThreadPool的spi實(shí)現(xiàn)有如下:
fixed 固定大小線(xiàn)程池在扰,啟動(dòng)時(shí)建立線(xiàn)程缕减,不關(guān)閉,一直持有芒珠。(缺省)
cached 緩存線(xiàn)程池桥狡,空閑一分鐘自動(dòng)刪除,需要時(shí)重建。
limited 可伸縮線(xiàn)程池裹芝,但池中的線(xiàn)程數(shù)只會(huì)增長(zhǎng)不會(huì)收縮部逮。只增長(zhǎng)不收縮的目的是為了避免收縮時(shí)突然來(lái)了大流量引起的性能問(wèn)題。
三嫂易、總結(jié)
dubbo提供了常用的線(xiàn)程模型和線(xiàn)程池?cái)U(kuò)展各有利弊兄朋,如果您有定制化需要,可以按照spi規(guī)范進(jìn)行定制炬搭。