注: Dubbo版本是2.6.2java
圖1 Dubbo的BroadcastClusterInvoker類繼承圖多線程
即廣播,每一個接收者都能收到消息。ide
核心代碼在BroadcastClusterInvoker的doInvoke(Invocation,List<Invoker<T>>,LoadBalance)中,源碼以下。spa
@Override @SuppressWarnings({"unchecked", "rawtypes"}) public Result doInvoke(final Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException { checkInvokers(invokers, invocation); RpcContext.getContext().setInvokers((List) invokers); RpcException exception = null; Result result = null; for (Invoker<T> invoker : invokers) { try { result = invoker.invoke(invocation); } catch (RpcException e) { exception = e; logger.warn(e.getMessage(), e); } catch (Throwable e) { exception = new RpcException(e.getMessage(), e); logger.warn(e.getMessage(), e); } } if (exception != null) { throw exception; } return result; }
循環遍歷全部的服務提供者,逐個進行請求,若是有異常出現,則記錄日誌。須要注意的是,Dubbo中,這裏並未使用多線程,因此我的估計若是服務提供者數量衆多或者請求處理耗時長,則總體的耗時應該會長,因此最好根據業務場景,進行合理的選擇。線程
因爲上面的源碼能夠看出,輪詢請求過程當中,任意一個拋出異常,並不會中斷後面的請求,只有在全部請求處理完成後,纔會去檢查異常。只有全部的請求都成功的狀況下,纔會將最後一次調用的結果返回。日誌
若是這個廣播過程用線程池實現,該怎麼實現,咱們須要考慮額外的哪些問題?這個留給讀者思考。code