注意:咱们分析的sofa-rpc版本是5.4.0。java
图1 FailFastCluster的类继承图框架
Failfast能够理解为只发起一次调用,若失败则当即报错。ide
核心代码在FailFastCluster的doInvoke(SofaRequest request)中,源码以下。spa
@Override public SofaResponse doInvoke(SofaRequest request) throws SofaRpcException { ProviderInfo providerInfo = select(request); try { SofaResponse response = filterChain(providerInfo, request); if (response != null) { return response; } else { throw new SofaRpcException(RpcErrorType.CLIENT_UNDECLARED_ERROR, "Failed to call " + request.getInterfaceName() + "." + request.getMethodName() + " on remote server " + providerInfo + ", return null"); } } catch (Exception e) { throw new SofaRpcException(RpcErrorType.CLIENT_UNDECLARED_ERROR, "Failed to call " + request.getInterfaceName() + "." + request.getMethodName() + " on remote server: " + providerInfo + ", cause by: " + e.getClass().getName() + ", message is: " + e.getMessage(), e); } }
重点在于请求异常以后,当即将异常抛出给调用者。.net
你是否在其它框架中看到过Failfast的实现? Dubbo中有Failfast的实现,能够去看Dubbo中FailfastClusterInvoker.java的实现,个人博客中分析过。code