dubbo有兩種執行緒池,第一種是i/o執行緒池,第二種是業務執行緒池。i/o執行緒池主要是收包發包,接收新的連線,業務執行緒則是執行我們的業務**(呼叫介面的實現類)。i/o執行緒數預設是cpu的個數+1,業務執行緒數預設是200。
與其他半同步半非同步的模型相似,dubbo的業務執行緒池也配備了佇列,不過佇列容量的預設值是0,也即是不使用佇列來快取處理不過來的請求;關於這點,官方文件是這麼解釋的:「執行緒池佇列大小,當執行緒池滿時,排隊等待執行的佇列大小,建議不要設定,當執行緒池滿時應立即失敗,重試其它服務提供機器,而不是排隊,除非有特殊需求」。在這點上,dubbo則跟thrift的hshaserver不同,後者使用了無限容量的佇列來快取所有來不及處理的請求,這種設計充滿了風險,伺服器面臨大量請求時會因為佇列耗盡記憶體而變得不穩定。
如果服務提供方的業務邏輯處理時間開銷很少,能夠快速完成,那麼直接在i/o執行緒上處理會更快,因為這樣減少了執行緒池排程與上下文切換的開銷。但是如果業務邏輯比較長,比如訪問資料庫,則應該在業務執行緒中執行。針對不同請求分配不同的執行緒池的策略由引數dispatcher來指定,這個引數這隸屬dubbo:protocol標籤,它用來指定每種訊息包是由i/o執行緒還是由業務執行緒來處理。
dispatcher有5個值:all, direct, message, execution, connection。
疏漏總結(八) 執行緒池
先從構造方法裡面的引數開始說。corepoolsize 核心執行緒數 核心執行緒是一定會存在著的執行緒,也就是說,如果你設定了假如說5,那麼不管這五個執行緒有沒有任務,都會被建立出來。queuecapacity 阻塞佇列 當核心執行緒數被使用到了最大值後,新任務如果還需要建立執行緒,就會進入阻塞佇列...
Dubbo執行緒模型
下面我們要看一下預設情況下的執行緒模型 首先明確乙個基本概念 io執行緒和業務執行緒的區別 dubbo預設採用的是長鏈結的方式,即預設情況下乙個consumer和乙個provider之間只會建立一條鏈結,這種情況下io執行緒的工作就是編碼和解碼資料,監聽具體的資料請求,直接通過channel發布資料...
Java併發程式設計八 執行緒池
1.降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷毀造成的消耗。2.提高響應速度。當任務到達時,任務可以不需要的等到執行緒建立就能立即執行。3.提高執行緒的可管理性。執行緒是稀缺資源,如果無限制的建立,不僅會消耗系統資源,還會降低系統的穩定性,使用執行緒池可以進行統一的分配,調優和監控。...