hystrix总结(一)

1、高可用系统架构

资源隔离:莫让一个bug耗光所有资源(比如线程)
限流:超过承载力的QPS直接拒绝
熔断:熔断后,后续请求直接不接受,一定时间后再重试
降级:比如mysql挂了,系统发现自动降级,下次请求从内存里提取数据。
运维监控:监控+报警+优化

2、Hystrix的设计原则

调用延迟+失败,提供容错
阻止故障蔓延
快速失败+快速恢复
降级
监控+报警+运维

3、依赖服务故障导致的蔓延

在这里插入图片描述
服务C的故障,会导致B的所有线程资源都卡在C上;最后导致服务B和服务A全挂了。

4、资源隔离避免故障拖垮整个系统

在这里插入图片描述
服务C的即使故障,也只会耗掉40个线程,服务D和服务E仍能正常工作。

5、资源隔离

1)线程池
2)信号量
在这里插入图片描述
线程池隔离在tomcat线程执行到execute(类似)时会切换到自己的线程,信号量隔离用的是tomcat的线程。所以线程池隔离可以更好的管控timeout。

6、线程池和信号量隔离,应用场景

线程池:适合99%的场景。对依赖服务的网络请求,timeout等问题。
信号量:适合,不是对外部依赖,而是对内部一些比较复杂逻辑的访问,这种访问,不涉及网络请求,不需要捕获timeout,并发量突然太高,导致很多线程卡在这里。一般常见于那种基于纯内存的业务逻辑服务。
总结:线程池最大的好处就是对于网络请求,如果有超时,可以避免调用线程阻塞。信号量常见于纯内存的业务逻辑服务。不涉及到任何网络请求。信号量技术有个缺点,
不能从timeout中抽离。

7、常用参数

1)execution.isolation.strategy
指定资源隔离策略,THREAD或者SEMAPHORE。默认就是线程池。
2)coreSize
设置线程池的大小,默认是10
3)queueSizeRejectionThreshold
控制queue满后reject的threshold,默认值是5。没有空闲线程资源,并且这个队列满了后,才会reject。
4)execution.isolation.semaphore.maxConcurrentRequests
SEMAPHORE隔离策略时,允许访问的最大并发量,超过了,请求直接被reject。默认值是10。

8、服务->接口->线程池

command group:聚合一些监控和报警信息
command线程池:默认就是command group名称,也可具体指定。
command key
command的名称默认为类名。通常command group代表了一个依赖服务,这个服务中的一个接口就是command key。线程池默认就是一个command group。但如果服务的几个接口,访问量不一样,差异非常之大,你可能就希望在这个服务command group内部,做细粒度的资源隔离,指定多个线程池。

发布了104 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zjuwzp/article/details/100866720