Dubbo集羣容錯模式之Broadcast實現

注: Dubbo版本是2.6.2java

                               

                                                圖1 Dubbo的BroadcastClusterInvoker類繼承圖多線程

1.Broadcast的含義

    即廣播,每一個接收者都能收到消息。ide

2.Dubbo中是怎麼實現

    核心代碼在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中,這裏並未使用多線程,因此我的估計若是服務提供者數量衆多或者請求處理耗時長,則總體的耗時應該會長,因此最好根據業務場景,進行合理的選擇。線程

    因爲上面的源碼能夠看出,輪詢請求過程當中,任意一個拋出異常,並不會中斷後面的請求,只有在全部請求處理完成後,纔會去檢查異常。只有全部的請求都成功的狀況下,纔會將最後一次調用的結果返回。日誌

3.思考

    若是這個廣播過程用線程池實現,該怎麼實現,咱們須要考慮額外的哪些問題?這個留給讀者思考。code

相關文章
相關標籤/搜索