youngyangyang04 / RPC-Java

【代码随想录知识星球】项目分享-手撕RPC框架🔥
186 stars 39 forks source link

熔断器的设计 #16

Open Qi18 opened 1 month ago

Qi18 commented 1 month ago
截屏2024-07-27 15 38 27

在我启动线程去测试熔断器生效时发现,每个线程请求都是单独的熔断器,所以整体来说不会产生熔断效果。但是,考虑到熔断器是在客户端的所以这样设计——对每个线程都会产生一个熔断器是正确的设计吗

GGBoooond commented 1 month ago

hello!感谢你提出的这个问题。 熔断器的设计是没有问题的,因为熔断器是从CircuitBreakerProvider中获取,而CircuitBreakerProvider在初始化代理对象时就已经创建,所有的请求共用一个Provider。 但是实际情况发现每次请求都创建了一个熔断器,原因是因为如图 1.没有在创建CircuitBreaker后将其放进map中 2.没有对获取的方法进行加锁的操作,导致出现的并发问题 image

在修复之后,50个线程访问时还是不能出现熔断成功的现象;这是因为大家都快速的经过了熔断器的判断,而统一卡在后面调用的流程中,所以即使限流器已经关闭了,所有的线程已经通过了判断,就不会被拒绝。所以在test中改为 120 个线程,每隔30个等待10s,这时就能够发现熔断器生效