Dubbo3 線(xiàn)程模型

2022-03-30 15:59 更新

配置 Dubbo 中的線(xiàn)程模型

如果事件處理的邏輯能迅速完成,并且不會(huì)發(fā)起新的 IO 請(qǐng)求,比如只是在內(nèi)存中記個(gè)標(biāo)識(shí),則直接在 IO 線(xiàn)程上處理更快,因?yàn)闇p少了線(xiàn)程池調(diào)度。

但如果事件處理邏輯較慢,或者需要發(fā)起新的 IO 請(qǐng)求,比如需要查詢(xún)數(shù)據(jù)庫(kù),則必須派發(fā)到線(xiàn)程池,否則 IO 線(xiàn)程阻塞,將導(dǎo)致不能接收其它請(qǐng)求。

如果用 IO 線(xiàn)程處理事件,又在事件處理過(guò)程中發(fā)起新的 IO 請(qǐng)求,比如在連接事件中發(fā)起登錄請(qǐng)求,會(huì)報(bào)“可能引發(fā)死鎖”異常,但不會(huì)真死鎖。

dubbo-protocol

因此,需要通過(guò)不同的派發(fā)策略和不同的線(xiàn)程池配置的組合來(lái)應(yīng)對(duì)不同的場(chǎng)景:

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

Dispatcher

  • ?all ?所有消息都派發(fā)到線(xiàn)程池,包括請(qǐng)求,響應(yīng),連接事件,斷開(kāi)事件,心跳等。
  • ?direct ?所有消息都不派發(fā)到線(xiàn)程池,全部在 IO 線(xiàn)程上直接執(zhí)行。
  • ?message ?只有請(qǐng)求響應(yīng)消息派發(fā)到線(xiàn)程池,其它連接斷開(kāi)事件,心跳等消息,直接在 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

  • ?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)題。
  • ?eager ?優(yōu)先創(chuàng)建?Worker?線(xiàn)程池。在任務(wù)數(shù)量大于?corePoolSize?但是小于?maximumPoolSize?時(shí),優(yōu)先創(chuàng)建?Worker?來(lái)處理任務(wù)。當(dāng)任務(wù)數(shù)量大于?maximumPoolSize?時(shí),將任務(wù)放入阻塞隊(duì)列中。阻塞隊(duì)列充滿(mǎn)時(shí)拋出?RejectedExecutionException?。(相比于?cached:cached?在任務(wù)數(shù)量超過(guò)?maximumPoolSize?時(shí)直接拋出異常而不是將任務(wù)放入阻塞隊(duì)列)


以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)