目录
一、概述二。业务场景介绍三。在线经验 _ 如何设置Hystrix线程池大小4,在线体验 _ 如何设置要求超时间五、服务降级六、总结上一篇文章讲述了一家朋友公司的使用Spring Cloud架构遇到问题的真实案例,虽然这不是一个大的技术问题,但如果你对某些事情了解不深,你真的会犯一些错误。
如果没看过上一篇文章的朋友,建议先看看:我进了新公司,不会用。SpringCloud,人生第一次被解雇
因为本文的案例背景将基于上一篇文章。
如果没看过上一篇文章的朋友,建议先看看:我进了新公司,不会用。SpringCloud,人生第一次被解雇
因为本文的案例背景将基于上一篇文章。
在这篇文章中,我们来谈谈如何保证整个系统在微服务架构中的高可用性。消除一些基础设施故障,如Redis集群挂了,Elasticsearch集群故障,MySQL宕机。
微服务架构本身
最最核心保证高可用性的措施有两点:
一个是基于Hystrix做资源隔离和熔断;另一种是制定备用降级计划。
在这里,如果你忘记了如何基于它hystrix如果做资源隔离、熔断、降级,可以回顾以前的文章: 电脑 用SpringCloud随机写配置的兄弟们,事故加班肯定很多
二、业务场景介绍
如上图所示,核心服务A调用核心服务B和C,当核心服务B响应过慢时,核心服务A的所有线程池都会卡住。
但是这个时候因为你用了hystrix做了资源隔离,所以核心服务A可以正常调用服务C,所以可以保证用户至少可以使用APP部分功能,只是与服务B相关的页面刷不出来,功能不能使用。
当然,这种情况在生产系统中是绝对不允许的,所以不要让上述情况发生。在上一篇文章中,我们最终将系统优化为下图:电脑要保证一个hystrix每秒的请求可以很容易地处理线程池还有合理的超时设置,避免要求过慢卡住线程。三、如何设置-如何设置Hystrix线程池大小
现在问题来了,
我们应该如何在生产环境中设置每一项服务?hystrix线程池的大小?
以下是我们在线系统优化后的生产经验总结:
假设您的服务A,每秒接收30个请求,向服务B发出30个请求,然后每个请求的响应时间和经验值约为200ms,那么你的hystrix线程池需要多少个线程?计算公式为:30(每秒请求数) * 0.2(每个请求的处理秒) 4(给点缓冲buffer) = (线程数量)。
若对上述公式有疑问,不妨反过来计算一下,
为什么10个线程能轻松抵抗每秒30个请求??
如果一个线程可以在200毫秒内执行一个请求,那么一个线程可以在1秒内执行5个请求。理论上,每秒只需要6个线程就可以执行30个请求。也就是说,在线程中的10个线程中,6个线程足以抵抗每秒30个请求。剩下的四行都在玩,闲着。
那为什么要多做4个线程呢??很简单,因为你得留一点buffer空间。
如果在系统高峰期,系统性能略有下降,此时许多要求需要300多毫秒才能完成,那么一个线程每秒只能处理3个要求,10个线程几乎不可能hold每秒30个请求。所以你必须考虑留下更多的线程。老规矩,给大家一张图,直观感受整个过程。四、在线经验-如何设置超时请求
线程数量OK嗯,请求的超时时间是多少?
答案是300毫秒。
为啥呢?这很简单。如果你的超时设置为500毫秒,想想可能会发生什么?
考虑到极端情况,如果服务B响应缓慢,响应需要500毫秒,每秒最多只能处理2个请求,10个请求只能处理20个请求。每秒有30个请求,结局会怎样?
让我们回顾一下第一张图片。,大量的线程会被卡住,没有时间处理这么多的请求,用户最终无法刷出页面。
假如您的线程池大小和超时间不配合设置,
很可能导致服务B的短性能波动,服务A的线程池瞬间卡死,内部的线程需要一段时间才能继续执行下一个请求。
即使服务B的接口性能在一段时间后恢复到200毫秒以内,服务B的线程池也需要很长时间才能恢复。
你的超时间设置得越不合理,比如设置得越长,设置到1秒、2秒,那么这种卡死的情况就需要越长的时间才能恢复。
因此,此时您的超时时间必须设置为300毫秒,以确保请求在300毫秒内无法完成,并立即超时返回。
这样,线程池中的线程就不会长时间卡住,并且可以有序地处理额外的要求。最重要的是,如果处理不完成,将在300毫秒内立即超时返回,但线程始终可以运行。
这样,当服务B的接口性能恢复到200毫秒以内时,服务A的线程池中的线程很快就会恢复。
这就是生产系统hystrix您需要考虑如何设置各种参数。否则,很可能会出现上述情况,使用高度Spring Cloud结构,结果和黑盒子一样,莫名其妙的系统故障,各种卡死,停机等等。
好吧,我们继续。如果系统每秒有6000个请求,然后核心服务A部署60台机器,每台机器每秒收到100个请求,
那么此时你的线程池需要多少个线程呢??
很简单,10个线程抗30个请求,30个线程抗100个请求,差不多。
此时,您应该知道服务A的线程池调用服务B的线程池分配了多少线程?如何设置超时时间也应该知道!
其实这个东西不是固定的,但是你要知道他的计算方法。
五、服务降级
设置这些后,应考虑服务降级。
如果你的服务挂了,那么你的hystrix会走熔断器,然后降级,你需要考虑每个服务的降级逻辑。
举一些常见的例子:
如果挂了查询数据的服务,可以查当地缓存。如果挂了写入数据的服务,可以先把这个写入操作记录日志,比如mysql或写入MQ如果在里面,以后慢慢恢复redis挂了,你可以查一下mysql如果mysql挂了,可以记录操作日志es进去,然后慢慢恢复数据。
六、总结
最后,如果你想玩微服务架构,你需要保证两点:首先你的hystrix必须设置合理的必须设置合理的参数,以避免高峰和频繁hystrix其次,针对个别服务故障,应设置合理的降级策略,确保所有服务挂断,可合理降级,整个系统可用!
------------- END -------------
此外,向您推荐儒猿课堂1元系列课程,欢迎加入一起学习~
互联网Java工程师面试突击课(1元专属)「链接」
SpringCloudAlibaba从零基础入门到项目实战(1元专属)「链接」
电商详情页系统实战项目(1元专属)在亿级流量下「链接」
Kafka新闻中间件核源码精讲(1元专属)「链接」
12个实战案例带你去玩Java并发编程(1元专属)「链接」
Elasticsearch精通零基础入门(1元专属)「链接」
基于Java手写分布式中间件系统实战(1元专属)「链接」