當我們聊dubbo執行緒模型&執行緒池策略的時候,我們應該考慮哪些問題?
根據請求的訊息類被io執行緒處理還是被業務執行緒池處理,dubbo提供了下面幾種執行緒模型:
alldispatcher原始碼剖析
all執行緒模型的實現如下:
/**
* default thread pool configure
* */
public class alldispatcher implements dispatcher
}
其中核心allchannelhandler把所有事件都交給業務執行緒池去處理,對應的**如下:
/**
* `all` 所有訊息都派發到執行緒池,包括請求,響應,連線事件,斷開事件,心跳等。
*/ public allchannelhandler(channelhandler handler, url url)
// 連線完成事件交給業務執行緒池處理
@override
public void connected(channel channel) throws remotingexception catch (throwable t)
}// 連線斷開事件交給業務執行緒池處理
public void disconnected(channel channel) throws remotingexception catch (throwable t)
}// 請求響應事件,交給業務執行緒池處理
@suppresswarnings("duplicates")
public void received(channel channel, object message) throws remotingexception catch (throwable t)
}throw new executionexception(message, channel, getclass() + " error when process received event .", t);}}
// 異常處理事件,交給業務執行緒池處理
public void caught(channel channel, throwable exception) throws remotingexception catch (throwable t)
}private executorservice getexecutorservice()
return cexecutor;}}
dubbo提供了常用的執行緒池模型,這些模型可以滿足我們絕大多數的需求,但是您可以根據自己的需要進行擴充套件定製。在服務提供者啟動執行緒時,我們會看到什麼時候載入的執行緒模型的實現。
擴充套件介面 threadpool 的spi實現有如下幾種:
其中fixed策略對應擴充套件實現類是fixedthreadpool,**如下:
/**
* threadpool
* * 執行緒池介面
*/@spi("fixed")
public inte***ce threadpool )
executor getexecutor(url url);
}
public class fixedthreadpool implements threadpool
}
可知使用threadpoolexecutor建立了核心執行緒數=最大執行緒池數=threads的執行緒池。
dubbo執行緒池擴充套件,這些擴充套件可以滿足我們絕大多數的需求,但是您可以根據自己的需要進行擴充套件定製。在服務提供者啟動流程時,我們會看到什麼時候載入的執行緒池擴充套件實現。
服務提供方會啟用nettyserver來監聽消費方的連線,建構函式如下:
public nettyserver(url url, channelhandler handler) throws remotingexception
這裡主要看channelhandlers.wrap(handler, executorutil.setthreadname(url, server_thread_pool_name)))這個**,該**載入了具體執行緒模型,是通過channelhandlers的wrapinternal方法完成:
/**
* 通道處理器工廠
*/public class channelhandlers
public static channelhandler wrap(channelhandler handler, url url)
protected static channelhandlers getinstance()
static void settestingchannelhandlers(channelhandlers instance)
protected channelhandler wrapinternal(channelhandler handler, url url)
}
Dubbo執行緒模型
下面我們要看一下預設情況下的執行緒模型 首先明確乙個基本概念 io執行緒和業務執行緒的區別 dubbo預設採用的是長鏈結的方式,即預設情況下乙個consumer和乙個provider之間只會建立一條鏈結,這種情況下io執行緒的工作就是編碼和解碼資料,監聽具體的資料請求,直接通過channel發布資料...
Dubbo執行緒模型與Sentinel運用
案例回放 增加執行緒池大小,設定為可伸縮執行緒池 這裡可以用配置name 是為了後續配置多個執行緒池組使用的 dubbo name dubbo port 21888 threadpool limited threads 500 queues 0 配置多個dubbo執行緒池 http呼叫極驗服務存在超...
dubbo中的執行緒池
dubbo提供了四種執行緒池。其實我理解還是還是根據threadpoolexecutor這個jdk提供的執行緒池類,只不過適應性的改變了其中的引數。dubbo分別提供了1.快取執行緒池 2。固定大小執行緒池 3.上屆執行緒池 4.定時執行緒池。下面具體的說一說這些執行緒池。1.公共行為 首先這些執行...