Dubbo 消費端服務併發控制

2021-10-18 22:31:48 字數 3595 閱讀 2354

二. 原始碼分析

三. 使用

原始碼說明:

該類表示提供端服務介面(包括介面中所有服務方法)、消費端服務介面(包括介面中所有服務方法)的當前呼叫次數、總數、失敗數、呼叫間隔等狀態資訊

**中有詳細注釋,重點關注begincount方法、endcount方法

service_statistics/method_statistics是靜態變數,相當於快取

package org.apache.dubbo.rpc;

public

class

rpcstatus

/** * 根據 url 返回介面中服務方法的 rpcstatus 狀態

*/public

static rpcstatus getstatus

(url url, string methodname)

/** * 服務方法執行前判斷是否滿足併發控制要求

** @param url

* @param methodname 服務方法

* @param max 併發控制的數量

* @return false:併發數已達到,掛起當前執行緒,等待喚醒

* @return true: 併發數未達到,可以執行

*/public

static

boolean

begincount

(url url, string methodname,

int max)

for(

int i;;)

// 併發數未達到,返回true

if(methodstatus.active.

compareandset

(i, i +1)

)}// 介面所有服務方法正在執行中的數量加1

incrementandget()

;return

true;}

/** * 服務方法執行後減少相關引數值(包括併發控制次數)

** @param url

* @param methodname

* @param elapsed

* @param succeeded

*/public

static

void

endcount

(url url, string methodname,

long elapsed,

boolean succeeded)

private

static

void

endcount

(rpcstatus status,

long elapsed,

boolean succeeded)

if(succeeded)

}else}}

}

原始碼說明:

是消費端並且url有指定key(actives) filter才生效(@activate(group = consumer, value = actives_key))

invoke:呼叫 rpcstatus.begincount 判斷是否滿足併發控制條件

rpcstatus.begincount返回false:則讓當前執行緒掛起,之後會在timeout時間後被喚醒,並丟擲rpcexception異常。

也可能在其它消費端正常執行完或異常後呼叫 notifyfinish() 方法喚醒。

如果超過timeout時間還沒被喚醒,則當前執行緒會自動被喚醒,然後丟擲rpcexception異常。

onresponse/onerror:方法執行完成或異常呼叫rpcstatus.endcount減去相應數量

onresponse/onerror:會呼叫notifyfinish通知掛起的消費者

package org.apache.dubbo.rpc.filter;

@activate

(group = consumer, value = actives_key)

public

class

activelimitfilter

implements

filter

, filter.listener

catch

(interruptedexception e)

long elapsed = system.

currenttimemillis()

- start;

remain = timeout - elapsed;

if(remain <=0)

}}} invocation.

put(activelimit_filter_start_time, system.

currenttimemillis()

);return invoker.

invoke

(invocation);}

/** * 服務方法正常返回

* @param invoker

* @param invocation

*/@override

public

void

onresponse

?> invoker, invocation invocation)

/** * 服務方法異常

* @param t

* @param invoker

* @param invocation

*/@override

public

void

onerror

(throwable t, invoker<

?> invoker, invocation invocation)

} rpcstatus.

endcount

(url, methodname,

getelapsed

(invocation)

,false);

notifyfinish

(rpcstatus.

getstatus

(url, methodname)

, max);}

private

long

getelapsed

(invocation invocation)

/** * 服務方法正常返回或異常後:會呼叫 notifyall 通知掛起的消費者

* @param rpcstatus

* @param max

*/private

void

notifyfinish

(final rpcstatus rpcstatus,

int max)}}

}

public

static

void

main

(string[

] args)

Dubbo 服務提供方併發控制

二.原始碼分析 三.使用 原始碼說明 該類表示提供端服務介面 包括介面中所有服務方法 消費端服務介面 包括介面中所有服務方法 的當前呼叫次數 總數 失敗數 呼叫間隔等狀態資訊 中有詳細注釋,重點關注begincount方法 endcount方法 service statistics method s...

Dubbo 服務提供方併發控制

目錄二.原始碼分析 三.使用 原始碼說明 該類表示提供端服務介面 包括介面中所有服務方法 消費端服務介面 包括介面中所有服務方法 的當前呼叫次數 總數 失敗數 呼叫間隔等狀態資訊 中有詳細注釋,重點關注begincount方法 endcount方法 service statistics method...

Dubbo併發控制和連線控制

限制com.foo.barservice的每個方法,伺服器端併發執行 或占用執行緒池執行緒數 不能超過10個 限制com.foo.barservice的sayhello方法,伺服器端併發執行 或占用執行緒池執行緒數 不能超過10個 1.2.1.控制到介面所有方法 限制com.foo.barservi...