New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
熔断降级重试设计是否可以优化 #104
Comments
1、sentinel的初始化类设计,实测确实没有必要,多谢老哥提醒。 |
咱们很多都是通过配置的class去帮用户去newInstance(),这个时候想通过构造函数做一些事情就很麻烦。这个具体是指什么?我感觉只要我们的配置类足够丰富,是不需要用户自己去创建实际的熔断规则实例的。 |
另外,从目前来看,resilience4j和Sentinel熔断的规则存在很大差异,我目前的自己加的抽象层确实毫无用处了。这块会考虑直接实现两套机制。 |
你的DegradeRuleRegister这个设计挺好的,优秀 |
对于第二点:这个确实我也在思考应该怎么暴露熔断属性的问题,我现在正在参考别的熔断设计,看看咱这个应该怎么把属性抽象出来。说实话也是因为这个东西我没想好,所以才提了个draft pull。😄 对于第三点:我也同意这个观点。所以我们也需要提醒一下用户这个类似于ribbon和hystrix的关系:如果加载了重试配置,你的超时时间设计要考虑重试时间,熔断配置要考虑重试时的异常比例/计数。 对于第五点:老哥你合的太快了,这个版本还不好用,可以先revert,有些地方的设计我还要再想一下。 咱们的newInstance()问题:我理解这是两种设计风格不同。我的习惯是使用spring机制通过接口解耦,然后根据不同的配置条件 比如说咱们 如果我是 还有就是我担心的是以后如果有那种new出来就不可变的对象,这时候是不会给机会去set了,这时候就要求咱们要把所有的属性都枚举出来,通过配置给他传进去,要不他还得动源码。 |
newInstance()大概理解了,确实可以以这种思路去做。其实目前项目中,大多数实现是优先从Spring获取Bean,Spring没有才会采用newInstance()进行兜底的。BaseResourceNameParser这里,确实也可以做这种方式。 |
这里我打算重新设计一下。支持shentinel和resilience4j,同时支持用户用很低的成本自定义的去扩展实现自己的熔断方案。 |
如果是这个想法,会不会想有些想类走一个熔断资源,另一些又是每个方法单独走一个熔断资源?确实用户有很多不同的诉求,我这里改成从Spring中获取BaseResourceNameParser实例应该就可以了。至于用户各种个性化需求,全部靠自己的BaseResourceNameParser就好了。 |
@chentianming11 |
这个我顺手改了就ok,问题不大 |
可以的,这种确实更合适一些,感谢建议。 |
我研究了一下关于熔断降级重试的设计,咱们很多都是通过配置的class去帮用户去newInstance(),这个时候想通过构造函数做一些事情就很麻烦。
咱们现在是这几个功能都走的okhttp的拦截器。熔断降级暂时只支持sentinel。
有几个问题:
说到底retrofit只是okhttp的一个便捷入口嘛。但是sentinel的初始化类设计的感觉有点摸不到头脑。
也许我们只要给一个具有factory功能的bean作为全局默认配置就可以?
还有一方面是我想去集成resilience4j做熔断,这块才多想了一些。r4j在spring gateway的做法就是类似于这种,只不过他是每次都会new一个spring context。
The text was updated successfully, but these errors were encountered: