Hystrix失败处理逻辑解析

  1. 熔断器打开

  2. 线程池/信号量跑满

  3. 调用超时

  4. 调用失败

本篇文章则介绍一下在发生降级时Hystrix的处理细节,下面的方法异常的处理逻辑:

final Func1<Throwable, Observable<R>> handleFallback = new Func1<Throwable, Observable<R>>() {	
            @Override	
            public Observable<R> call(Throwable t) {	
                circuitBreaker.markNonSuccess();	
                Exception e = getExceptionFromThrowable(t);	
                executionResult = executionResult.setExecutionException(e);	
                if (e instanceof RejectedExecutionException) {	
                    return handleThreadPoolRejectionViaFallback(e);	
                } else if (t instanceof HystrixTimeoutException) {	
                    return handleTimeoutViaFallback();	
                } else if (t instanceof HystrixBadRequestException) {	
                    return handleBadRequestByEmittingError(e);	
                } else {	
                    /*	
                     * Treat HystrixBadRequestException from ExecutionHook like a plain HystrixBadRequestException.	
                     */	
                    if (e instanceof HystrixBadRequestException) {	
                        eventNotifier.markEvent(HystrixEventType.BAD_REQUEST, commandKey);	
                        return Observable.error(e);	
                    }	

	
                    return handleFailureViaFallback(e);	
                }	
            }	
        };

这里我们拿线程池跑满的逻辑来进行分析

线程池跑满
 private Observable<R> handleThreadPoolRejectionViaFallback(Exception underlying) {	
        eventNotifier.markEvent(HystrixEventType.THREAD_POOL_REJECTED, commandKey);	
        threadPool.markThreadRejection();	
        // use a fallback instead (or throw exception if not implemented)	
        return getFallbackOrThrowException(this, HystrixEventType.THREAD_POOL_REJECTED, FailureType.REJECTED_THREAD_EXECUTION, "could not be queued for execution", underlying);	
    }
  1. 第一行发布了一个线程池拒绝的事件

  2. 第二行记录了线程池拒绝的次数

  3. 获取Fallback方法

获取Fallback方法
 
 

方法比较长,主要做了以下事情:

  1. 直接看isUnrecoverable方法,判断异常是否为不可恢复异常,如果不可恢复则直接返回失败

  2. 如果是可恢复异常则打印日志

  3. 判断是否开启执行回退方法,如果开启进入步骤4

  4. 创建开始和完成需要发送的两个事件:FALLBACK_EMITFALLBACK_SUCCESS

  5. 创建调用回退方法出现异常时的处理逻辑:handleFallbackError,而这种场景发生的异常只有两种情况:

    1. UnsupportedOperationException异常:未实现getFallback抽象方法

    2. 其他异常

  6. 创建释放信号量的Action:singleSemaphoreRelease

  7. 获取信号量,如果成功执行回退逻辑,也就是调用用户实现的getFallback方法

  8. final protected Observable<R> getFallbackObservable() {	
         return Observable.defer(new Func0<Observable<R>>() {	
             @Override	
             public Observable<R> call() {	
                 try {	
                     return Observable.just(getFallback());	
                 } catch (Throwable ex) {	
                     return Observable.error(ex);	
                 }	
             }	
         });	
     }

对于其他异常类型的处理感兴趣的同学可以继续基于Func1 handleFallback研究

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值