6 Dubbo執行緒模型與執行緒池策略

2021-10-03 22:42:11 字數 2694 閱讀 5791

當我們聊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.公共行為 首先這些執行...