Dubbo剖析-并發(fā)控制

一路翻、前言

前面講解了Dubbo的服務(wù)降級狈癞,本節(jié)我們來講解dubbo中的并發(fā)控制,并發(fā)控制分為客戶端并發(fā)控制和服務(wù)端并發(fā)控制茂契。

二蝶桶、并發(fā)控制

2.1 客戶端并發(fā)控制

在服務(wù)消費方法進行并發(fā)控制需要設(shè)置actives參數(shù),如下:

<dubbo:reference id="userService" interface="com.test.UserServiceBo"
        group="dubbo" version="1.0.0" timeout="3000" actives="10"/>

設(shè)置com.test.UserServiceBo接口中所有方法掉冶,每個方法最多同時并發(fā)請求10個請求。

也可以使用下面方法設(shè)置接口中的單個方法的并發(fā)請求個數(shù)厌小,如下:


    <dubbo:reference id="userService" interface="com.test.UserServiceBo"
        group="dubbo" version="1.0.0" timeout="3000">
                <dubbo:method name="sayHello" actives="10" />
    </dubbo:reference>

如上設(shè)置sayHello方法的并發(fā)請求數(shù)量最大為10恢共,如果客戶端請求該方法并發(fā)超過了10則客戶端會被阻塞,等客戶端并發(fā)請求數(shù)量少于10的時候璧亚,該請求才會被發(fā)送到服務(wù)提供方服務(wù)器讨韭。在dubbo中客戶端并發(fā)控制是使用ActiveLimitFilter過濾器來控制的,代碼如下:

public class ActiveLimitFilter implements Filter {

    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        URL url = invoker.getUrl();
        String methodName = invocation.getMethodName();
        //獲取設(shè)置的acvites的值癣蟋,默認(rèn)為0
        int max = invoker.getUrl().getMethodParameter(methodName, Constants.ACTIVES_KEY, 0);
        //獲取當(dāng)前方法目前并發(fā)請求數(shù)量
        RpcStatus count = RpcStatus.getStatus(invoker.getUrl(), invocation.getMethodName());
        if (max > 0) {//說明設(shè)置了actives變量
            long timeout = invoker.getUrl().getMethodParameter(invocation.getMethodName(), Constants.TIMEOUT_KEY, 0);
            long start = System.currentTimeMillis();
            long remain = timeout;
            int active = count.getActive();
            //如果該方法并發(fā)請求數(shù)量大于設(shè)置值透硝,則掛起當(dāng)前線程。
            if (active >= max) {
                synchronized (count) {
                    while ((active = count.getActive()) >= max) {
                        try {
                            count.wait(remain);
                        } catch (InterruptedException e) {
                        }
                        //如果等待時間超時疯搅,則拋出異常
                        long elapsed = System.currentTimeMillis() - start;
                        remain = timeout - elapsed;
                        if (remain <= 0) {
                            throw new RpcException("Waiting concurrent invoke timeout in client-side for service:  "
                                    + invoker.getInterface().getName() + ", method: "
                                    + invocation.getMethodName() + ", elapsed: " + elapsed
                                    + ", timeout: " + timeout + ". concurrent invokes: " + active
                                    + ". max concurrent invoke limit: " + max);
                        }
                    }
                }
            }
        }
        //沒有限流時候濒生,正常調(diào)用
        try {
            long begin = System.currentTimeMillis();
            RpcStatus.beginCount(url, methodName);
            try {
                Result result = invoker.invoke(invocation);
                RpcStatus.endCount(url, methodName, System.currentTimeMillis() - begin, true);
                return result;
            } catch (RuntimeException t) {
                RpcStatus.endCount(url, methodName, System.currentTimeMillis() - begin, false);
                throw t;
            }
        } finally {
            if (max > 0) {
                synchronized (count) {
                    count.notify();
                }
            }
        }
    }

}

可知客戶端并發(fā)控制,是如果當(dāng)并發(fā)量達到指定值后幔欧,當(dāng)前客戶端請求線程會被掛起罪治,如果在等待超時期間并發(fā)請求量少了丽声,那么阻塞的線程會被激活,然后發(fā)送請求到服務(wù)提供方规阀,如果等待超時了恒序,則直接拋出異常,這時候服務(wù)根本都沒有發(fā)送到服務(wù)提供方服務(wù)器谁撼。

2.2 服務(wù)端并發(fā)控制

在服務(wù)提供方進行并發(fā)控制需要設(shè)置executes參數(shù)歧胁,如下:

        <dubbo:service interface="com.test.UserServiceBo" ref="userService"
            group="dubbo"  version="1.0.0" timeout="3000" executes="10"/>

設(shè)置com.test.UserServiceBo接口中所有方法,每個方法最多同時并發(fā)處理10個請求厉碟,這里并發(fā)是指同時在處理10個請求喊巍。

也可以使用下面方法設(shè)置接口中的單個方法的并發(fā)處理個數(shù),如下:



        <dubbo:service interface="com.test.UserServiceBo" ref="userService"
            group="dubbo" version="1.0.0" timeout="3000" >
            <dubbo:method name="sayHello" executes="10" />
        </dubbo:service>

如上設(shè)置sayHello方法的并發(fā)處理數(shù)量為10.

需要注意的是箍鼓,服務(wù)提供方設(shè)置并發(fā)數(shù)量后崭参,如果同時請求數(shù)量大于了設(shè)置的executes的值,則會拋出異常款咖,而不是像消費端設(shè)置actives時候何暮,會等待。服務(wù)提供方并發(fā)控制是使用ExecuteLimitFilter過濾器實現(xiàn)的铐殃,ExecuteLimitFilter代碼如下:

    public class ExecuteLimitFilter implements Filter {

        public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
            URL url = invoker.getUrl();
            //默認(rèn)不設(shè)置executes時候海洼,其值為0
            int max = url.getMethodParameter(methodName, Constants.EXECUTES_KEY, 0);
            if (max > 0) {//max>0說明設(shè)置了executes值
                RpcStatus count = RpcStatus.getStatus(url, invocation.getMethodName());
                //可知如果并發(fā)處理數(shù)量大于設(shè)置的值,會拋出異常
                executesLimit = count.getSemaphore(max);
                if(executesLimit != null && !(acquireResult = executesLimit.tryAcquire())) {
                    throw new RpcException("Failed to invoke method " + invocation.getMethodName() + " in provider " + url + ", cause: The service using threads greater than <dubbo:service executes=\"" + max + "\" /> limited.");
                }
            }
            ...
            try {//沒有限流時候富腊,激活filter鏈
                Result result = invoker.invoke(invocation);
                return result;
            } catch (Throwable t) {
             ...
            } finally {
               ...
            }
        }
    }

所以當(dāng)使用executes參數(shù)時候要注意坏逢,當(dāng)并發(fā)量過大時候,多余的請求會失敗赘被。

三是整、總結(jié)

本節(jié)我們講解了dubbo中客戶端并發(fā)控制和服務(wù)端并發(fā)控制。另外另外想系統(tǒng)學(xué)dubbo的單擊我 ,想學(xué)并發(fā)的童鞋可以 單擊我

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末民假,一起剝皮案震驚了整個濱河市浮入,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羊异,老刑警劉巖事秀,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異球化,居然都是意外死亡秽晚,警方通過查閱死者的電腦和手機瓦糟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門筒愚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人菩浙,你說我怎么就攤上這事巢掺【淞妫” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵陆淀,是天一觀的道長考余。 經(jīng)常有香客問我,道長轧苫,這世上最難降的妖魔是什么楚堤? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮含懊,結(jié)果婚禮上身冬,老公的妹妹穿的比我還像新娘。我一直安慰自己岔乔,他們只是感情好酥筝,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雏门,像睡著了一般嘿歌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茁影,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天宙帝,我揣著相機與錄音,去河邊找鬼呼胚。 笑死茄唐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蝇更。 我是一名探鬼主播沪编,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼年扩!你這毒婦竟也來了蚁廓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤厨幻,失蹤者是張志新(化名)和其女友劉穎相嵌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體况脆,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡饭宾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了格了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片看铆。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖盛末,靈堂內(nèi)的尸體忽然破棺而出弹惦,到底是詐尸還是另有隱情否淤,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布棠隐,位于F島的核電站石抡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏助泽。R本人自食惡果不足惜啰扛,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗡贺。 院中可真熱鬧侠讯,春花似錦、人聲如沸暑刃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岩臣。三九已至溜嗜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間架谎,已是汗流浹背炸宵。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谷扣,地道東北人土全。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像会涎,于是被迫代替她去往敵國和親裹匙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理末秃,服務(wù)發(fā)現(xiàn)概页,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 聽练慕,見真知 《邏輯思維》 微信群管理 1.微信弱關(guān)系群人員多惰匙、情況復(fù)雜,最好采用比較保守的策略:不冒險铃将,不冒進项鬼。 ...
    風(fēng)月瀟湘閱讀 493評論 0 0
  • 作者|伏櫪老馬 最近绘盟,在網(wǎng)上看到一則視頻,光天化日,朗朗乾坤奥此,一個算卦的竟然在路邊,手插進一個女子的衣服里雁比,表情肅...
    道訊閱讀 3,198評論 8 8
  • 中醫(yī)讓我們“盲目”樂觀稚虎,一高興病就好了!西醫(yī)叫我們“莫名”悲哀偎捎,一難過蠢终,病越來越嚴(yán)重…… ——《滴水齋悟語》
    則賢閱讀 163評論 0 2
  • 又到一年高考季,記得那時候什么也沒有除了夢想茴她。無奈凡考試就各種不適寻拂,。后來才知道這就是心理學(xué)中所謂的考試焦慮丈牢。 ...
    千古東方閱讀 991評論 1 8