热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sofarpc集群容错之Failfast实现

2019独角兽企业重金招聘Python工程师标准注意:我们分析的sofa-rpc版本是5.4.0。图1FailFastCluster的类继承图1.Failfas

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

注意:我们分析的sofa-rpc版本是5.4.0。

                    

                                                        图1 FailFastCluster的类继承图

1.Failfast的含义

    Failfast可以理解为只发起一次调用,若失败则立即报错。


2.sofa-rpc中Failfast的实现

    核心代码在FailFastCluster的doInvoke(SofaRequest request)中,源码如下。

@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);}
}

  •     首先select(request)获取一个服务提供者。    
  •     filterChain(providerInfo,request)的实现不关心,把它理解为一个黑盒,它的作用是调用服务提供者的服务。
  •     如果结果为不为null且不抛出异常,则返回结果;如果抛出异常,则先catch,而后封装原始异常,之后再讲异常抛出。

    重点在于请求异常之后,立即将异常抛出给调用者。

3.思考

    你是否在其它框架中看到过Failfast的实现? Dubbo中有Failfast的实现,可以去看Dubbo中FailfastClusterInvoker.java的实现,我的博客中分析过。


转载于:https://my.oschina.net/u/2518341/blog/1815091


推荐阅读
author-avatar
雅蕙蕙蕙
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有