win10系统内核启动缓慢 (win10启动和运行特别慢。

目录

一、概述二。业务场景介绍三。在线经验 _ 如何设置Hystrix线程池大小4,在线体验 _ 如何设置要求超时间五、服务降级六、总结


一、概述

上一篇文章讲述了一家朋友公司的使用Spring Cloud架构遇到问题的真实案例,虽然这不是一个大的技术问题,但如果你对某些事情了解不深,你真的会犯一些错误。

如果没看过上一篇文章的朋友,建议先看看:我进了新公司,不会用。SpringCloud,人生第一次被解雇

因为本文的案例背景将基于上一篇文章。

如果没看过上一篇文章的朋友,建议先看看:我进了新公司,不会用。SpringCloud,人生第一次被解雇

因为本文的案例背景将基于上一篇文章。

在这篇文章中,我们来谈谈如何保证整个系统在微服务架构中的高可用性。消除一些基础设施故障,如Redis集群挂了,Elasticsearch集群故障,MySQL宕机。

微服务架构本身

最最核心

保证高可用性的措施有两点:
一个是基于Hystrix做资源隔离和熔断;另一种是制定备用降级计划。

如果资源隔离降级完善,在双11高并发场景下可能会出现个别服务故障,但永远不会蔓延到整个系统停机。


在这里,如果你忘记了如何基于它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的线程池分配了多少线程?如何设置超时时间也应该知道!

其实这个东西不是固定的,但是你要知道他的计算方法。

根据服务响应时间和系统高峰QPS、计算出线程池的大小和超时时间有多少台机器!

五、服务降级

设置这些后,应考虑服务降级。

如果你的服务挂了,那么你的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元专属)「链接」

基于ShardingSphere分库分表实战课(1元专属)「链接」