在收到提供者執行的結果時,當結果處理失敗時,需要對其進行處理。
在reference中,返回的invoker是根據對應的容錯機制生成的invoker
@spi(failovercluster.name)
public inte***ce cluster
public class failovercluster implements cluster
}
public class failoverclusterinvokerextends abstractclusterinvoker
// retry loop.
rpcexception le = null; // last exception.
list> invoked = new arraylist>(copyinvokers.size());
setproviders = new hashset(len);
//迴圈重試次數
for (int i = 0; i < len; i++)
//選擇對應的invoker
invokerinvoker = select(loadbalance, invocation,
copyinvokers, invoked);
invoked.add(invoker);
rpccontext.getcontext().setinvokers((list)invoked);
try finally
}throw new rpcexception("");
}}
public class failfastclusterinvokerextends abstractclusterinvoker
public result doinvoke(invocation invocation, list> invokers,
loadbalance loadbalance) throws rpcexception catch (throwable e)
}}
public result doinvoke(final invocation invocation, list>
invokers, loadbalance loadbalance) throws rpcexception catch (rpcexception e) catch (throwable e)
}if (exception != null)
return result;
}
//忽視異常,放入到列表中,定時等待重試
protected result doinvoke(invocation invocation, list> invokers,
loadbalance loadbalance) throws rpcexception catch (throwable e)
} //啟動定時,每隔5秒呼叫
private void addfailed(invocation invocation, abstractclusterinvoker<?> router) catch (throwable t)
}}, 5 * 1000, 5 * 1000, timeunit.milliseconds);}}
} failed.put(invocation, router);
}void retryfailed()
//迴圈呼叫出現異常的invoker
for (map.entry> entry : new
hashmap>(failed).entryset()) catch (throwable e)
}}
public result doinvoke(invocation invocation, list> invokers,
loadbalance loadbalance) throws rpcexception catch (throwable e)
}
public result doinvoke(final invocation invocation, list>
invokers, loadbalance loadbalance) throws rpcexception else }}
rpccontext.getcontext().setinvokers((list)selected);
final atomicinteger count = new atomicinteger();
//建立佇列,進入等待,只有呼叫成功或者出現異常達到次數,才喚醒
final blockingqueueref = new linkedblockingqueue();
for (final invokerinvoker : selected) catch(throwable e) }}
});}
try
return (result) ret;
} catch (interruptedexception e)
}
Dubbo 集群容錯
在進行系統設計時候,不僅要考慮正常邏輯該如何走,還要考慮異常邏輯。dubbo中當服務消費方呼叫服務提供方的服務出現錯誤時候,提供了多種容錯方案,預設為 failover 重試。重試。當服務消費方呼叫服務提供者失敗後自動切換,重試其它服務提供者。這通常用於讀操作或者具有冪等的寫操作,需要注意的是重試會...
dubbo 集群容錯
在集群呼叫失敗時,dubbo 提供了多種容錯方案,預設為 failover 重試。集群容錯模式 failover cluster 失敗自動切換,當出現失敗,重試其它伺服器。通常用於讀操作,但重試會帶來更長延遲。可通過 retries 2 來設定重試次數 不含第一次 重試次數配置如下 dubbo se...
Dubbo 集群容錯
二.dubbo集群容錯模式 三.cluster介面及實現類結構圖 四.原始碼解析 4.其它模式 參考原始碼 五.實現自定義cluster 六.使用自定義cluster 這裡不是使用所有服務提供者初始化invoked物件,只是使用了指定長度初始化空的list陣列 list invoked newarr...