从 Hystrix 迁移到 Sentinel withExecutionTimeoutInMilli

在使用spring cloud openfeign的时候,我们常常会使用单个的FeignClient定义很多的mapping,但是spring cloud feign本身只支持feignClient级别的超时,不支持mapping级别的超时. 所以我们通常会结合Hystrix来定义单个mapping的超时. 但是切换到Sentinel后,我们无法对单个feignClient的mapping做超时处理了。针对这个问题,迁移时有什么好的方法吗?

public class FooServiceCommand extends HystrixCommand {

protected FooServiceCommand(HystrixCommandGroupKey group) {
    super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("OtherGroup"))
        // command key
        .andCommandKey(HystrixCommandKey.Factory.asKey("fooService"))
        .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
            .withExecutionTimeoutInMilliseconds(500) // 这句无法迁移
            .withCircuitBreakerRequestVolumeThreshold(5)
            .withCircuitBreakerErrorThresholdPercentage(50)
            .withCircuitBreakerSleepWindowInMilliseconds(10000)
        ));
}

@Override
protected String run() throws Exception {
    return "some_result";
}

}

这个问题不在feign里面也会出现,因为都有这种超时中断的场景.

原提问者GitHub用户sN0wpeak

展开
收起
学习娃 2023-05-19 16:05:25 102 分享 版权
1 条回答
写回答
取消 提交回答
  • 这个的本质因素是因为Hystrix可以做物理线程池的方式进行隔离,而Sentinel则基于信号量做隔离,Sentinel更轻量、更解耦,超时设置我认为应该回归到框架/类库本身去做设置。

    至于client对象本身,参考httpclient/asynchttpclient等实现,client本身是轻量级的对象,所以如果纯基于client来做超时,一般是按client做设置,不同的配置组合定义不同的client(未必一定重用),并且从文档来看,通过hystrix的线程池模型来做超时等效,实际上跟设置连接本身的超时也是完全不一样的性质。

    原回答者GitHub用户jasonjoo2010

    2023-05-19 20:49:36
    赞同 展开评论
问答分类:
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

还有其他疑问?
咨询AI助理