(十七)分組聚合

2021-08-13 13:55:24 字數 2446 閱讀 4978

一般來說,消費者進行遠端呼叫時,會呼叫遠端的乙個提供者。

現在可以消費者呼叫乙個方法,可以呼叫提供者多個方法再聚合結果返回。

public invokerrefer(classtype, url url) throws rpcexception 

// group="a,b" or group="*"

mapqs = stringutils.parsequerystring(url.getparameteranddecoded(constants.refer_key));

string group = qs.get(constants.group_key);

//c1處

if (group != null && group.length() > 0 )

}return dorefer(cluster, registry, type, url);

}

consumer端在初始化reference時,先判斷是否有配置group屬性,如果有配置,則使用合併集群,即「c1處」,多個分組用「,」分隔。

看看合併集群mergeablecluster是怎麼呼叫分組的:

public result invoke(final invocation invocation) throws rpcexception 

}return invokers.iterator().next().invoke(invocation);

}class<?> returntype;

try catch ( nosuchmethodexception e )

//m2處

map> results = new hashmap>();

for( final invokerinvoker : invokers )

} );

results.put( invoker.geturl().getservicekey(), future );

}object result = null;

listresultlist = new arraylist( results.size() );

int timeout = geturl().getmethodparameter( invocation.getmethodname(), constants.timeout_key, constants.default_timeout );

//m3處

for ( map.entry> entry : results.entryset() ) else

} catch ( exception e )

}if (resultlist.size() == 0) else if (resultlist.size() == 1)

if (returntype == void.class)

if ( merger.startswith(".") ) catch ( nosuchmethodexception e )

if ( method != null )

result = resultlist.remove( 0 ).getvalue();

try

} else

}} catch ( exception e )

} else

} else else

if (resultmerger != null)

//m5處

result = resultmerger.merge(

rets.toarray((object)array.newinstance(returntype, 0)));

} else

}return new rpcresult( result );

}

雖然reference引用標籤配置了group屬性,但如果呼叫的方法配置不使用group屬性,則也會退化為只呼叫乙個提供者的,即原始碼「m1處」;

mergeablecluster用多執行緒分別呼叫多個分組裡的提供者,即原始碼「m2處」,並將分組的返回結果聚合起來「m3處」,在「m4處」,如果沒有配置聚合器,則使用dubbo預設的聚合器,否則,「m5處」,會使用使用者配置的聚合器合併結果返回,自己定義的聚合器,實現merger介面即可。

package com.alibaba.dubbo.rpc.cluster;

public inte***ce merger

並在meta-inf/dubbo/internal目錄下配置com.alibaba.dubbo.rpc.cluster.merger自己的聚合器,配置跟dubbo的過濾器類似,比如:

#com.alibaba.dubbo.rpc.cluster.merger分組聚合結果擴充套件

mymerger = xx.xx.mymerger

自己寫了個rpc:

可以給個star,^0^.

收集面試題(十七)(分數使之有倍數關係)

將1 2 3 4 5 6 7 8 9 這九個數字分成三個百位數,每個數字用且只用一次,並且第三個數字是第乙個的3倍,第二個數字是第乙個的2倍。求三個數。說明,結果可能多於一組,例如327 654 981 public class getnumbers gets the numbers.return ...

oracle9i學習筆記之十七 分級取回資料

1.分級查詢 select level column,expr.from table where condition s start with condition s connect by prior condition s level 對每行返回乙個級別,對根行level偽列返回1 對孩子的lev...

jmeter(二十七)分布式壓測注意事項

一 壓測機 1 數量 成本 無論是從成本角度還是維護的難易方面,壓測機的數量,適量就好。舉個例子,8c16g的一台伺服器,部署jmeter後,根據我個人的測試比對資料,配置 1500個執行緒數,最好。太多了效能損耗較大,延時高 太少了又浪費。2 controller agent 模擬的併發執行緒數超...