Hystrix 熔斷機制

  

  熔斷機制至關於電路的跳閘功能,即在必定時間內,錯誤比例達到必定數目時業務從原來流程轉移到另外的流程處理。在一段時間後,恢復到原業務邏輯。java

 

  測試代碼以下緩存

  

/**
 * @author zimu
 * @description Hystrix 熔斷機制
 * @since 2018-3-1 16:20
 */
public class HystrixCommand4CircuitBreakerTest extends HystrixCommand < String > {

    private static final Logger log = LoggerFactory.getLogger(HystrixCommand4CircuitBreakerTest.class);

    private final String value;

    public HystrixCommand4CircuitBreakerTest(String value) {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CircuitBreakerTestGroup"))
                .andCommandKey(HystrixCommandKey.Factory.asKey("CircuitBreakerTestKey"))
                .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("CircuitBreakerTest"))
                .andThreadPoolPropertiesDefaults(    // 配置線程池
                        HystrixThreadPoolProperties.Setter()
                                .withCoreSize(200)    // 配置線程池裏的線程數,設置足夠多線程,以防未熔斷卻打滿threadpool
                )
                .andCommandPropertiesDefaults(    // 配置熔斷器
                        HystrixCommandProperties.Setter()
                                .withCircuitBreakerEnabled(true)
                                .withCircuitBreakerRequestVolumeThreshold(2)    //單位時間內最少請求次數
                                .withCircuitBreakerErrorThresholdPercentage(60)     //熔斷比例
                                .withExecutionTimeoutInMilliseconds(500)   //單次執行超時時間
                                .withCircuitBreakerSleepWindowInMilliseconds(3000)      //熔斷時間窗口,默認:5秒.熔斷器中斷請求5秒後會進入半打開狀態,放下一個請求進來重試,若是該請求成功就關閉熔斷器,不然繼續等待一個熔斷時間窗口
                )
        );
        this.value = value;
    }

    @Override
    protected String run() throws Exception {
        log.info("run():" + value);
        int num = Integer.valueOf(value);
        if (num % 2 == 0 && (num < 10 || num > 20)) {    // 直接返回
            return value;
        } else {
            TimeUnit.MILLISECONDS.sleep(800);
            return value;
        }
    }

    @Override
    protected String getFallback() {
        log.info("fallback: " + value);
        return "fallback: " + value;
    }

    public static class Test {

        public static void main(String[] args) {
            for (int i = 0; i < 30; i++) {
                try {
                    new HystrixCommand4CircuitBreakerTest(String.valueOf(i)).execute();

                    if (i > 15) {
                        TimeUnit.MILLISECONDS.sleep(1000);
                    }

                } catch (Exception e) {
                    System.out.println("HystrixBadRequestException" + e.getCause());
                }
            }

        }

    }

}

  

附:配置參數多線程

//熔斷器在整個統計時間內是否開啓的閥值,默認20秒。也就是10秒鐘內至少請求20次,熔斷器才發揮起做用  
private final HystrixProperty<Integer> circuitBreakerRequestVolumeThreshold;   
//熔斷器默認工做時間,默認:5秒.熔斷器中斷請求5秒後會進入半打開狀態,放部分流量過去重試  
private final HystrixProperty<Integer> circuitBreakerSleepWindowInMilliseconds;   
//是否啓用熔斷器,默認true. 啓動  
private final HystrixProperty<Boolean> circuitBreakerEnabled;   
//默認:50%。當出錯率超過50%後熔斷器啓動.  
private final HystrixProperty<Integer> circuitBreakerErrorThresholdPercentage;  
//是否強制開啓熔斷器阻斷全部請求,默認:false,不開啓  
private final HystrixProperty<Boolean> circuitBreakerForceOpen;   
//是否容許熔斷器忽略錯誤,默認false, 不開啓  
private final HystrixProperty<Boolean> circuitBreakerForceClosed; 

  

//配置線程池大小,默認值10個. 建議值:請求高峯時99.5%的平均響應時間 + 向上預留一些便可 
 private final HystrixProperty corePoolSize; /*
 //配置線程值等待隊列長度,默認值:-1 建議值:-1表示不等待直接拒絕,測試代表線程池使用直接決絕策略+ 合適大小的非回縮線程池效率最高.因此不建議修改此值。 當使用非回縮線程池時,queueSizeRejectionThreshold,keepAliveTimeMinutes 參數無效 
 private final HystrixProperty maxQueueSize;


 //請求合併是容許的最大請求數,默認:Integer.MAX_VALUE  private final HystrixProperty maxRequestsInBatch;
 //批處理過程當中每一個命令延遲的時間,默認:10毫秒
 private final HystrixProperty timerDelayInMilliseconds;
 //批處理過程當中是否開啓請求緩存,默認:開啓
 private final HystrixProperty requestCacheEnabled;
相關文章
相關標籤/搜索