高可用(一)系统设计

参考:javaguide.cn

高可用及其评价指标?

可用性是指系统提供服务的能力,高可用是指系统即使在发生一些未知故障时仍然能够提供服务的能力,使用多少个9来评判一个系统的可用性,即系统可正常提供服务的时间与系统运行时间的比例。

导致系统不可用的情况?

系统遭到攻击、硬件故障、网络故障、并发量激增、代码问题等。

提高系统可用性的方法?

1 注重代码质量:

养成CodeReview的习惯,避免内存泄漏、循环依赖等问题。
使用代码分析工具:
sonarqube使用教程alibaba/arthas诊断工具、idea自带的代码分析工具。

2 使用集群:

避免单点故障,例如mysql集群、redis集群、zk集群等。

Sentinel 熔断 降级 限流 高可用基石(重要)

熔断和降级的操作比较模糊,对于远程调用的不同对象可以有不同的表述。
注:sentinel可以监控到给注册的所有服务发送的全部请求。
在这里插入图片描述
在这里插入图片描述
信号量隔离:允许多个线程访问同一个资源,就像停车位一样,每一时刻允许的线程数是固定的。
QPS控制实现原理是信号量隔离;并发线程数控制实现原理是线程池隔离。

sentinel文档:https://sentinelguard.io/zh-cn/docs/introduction.html
1)基本使用:https://sentinelguard.io/zh-cn/docs/basic-api-resource-rule.html ,
在这里插入图片描述
在这里插入图片描述
定义资源的 方式一(主流框架默认适配)、 二(抛异常定义资源)、 四(注解) 用的较多
资源:首先是sentinel扫描到的对于服务的请求-默认适配的资源、自定义资源。
自定义资源:抛异常方式、注解
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里的fallback就像 feignClient中的fallback函数。

2)整合springboot/springcloud:https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel,
包括配置控制台、springboot的Endpoint 支持
在这里插入图片描述
注:springmvc的请求路径(除去根路径),是默认的资源名。
实时监控没有图表数据:配置springboot的监控暴露 actuator
自定义流控响应数据:创建配置类,限流时或者降级时调用该方法返回自定义的数据。
在这里插入图片描述
3)sentinel做流量控制:https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
在这里插入图片描述
统计类型:QPS流量控制、并发线程数控制
流控模式:直接模式;链路限流:指定入口的请求调用资源时才限流;关联限流。
流控效果:当 QPS 超过某个阈值的时候,则采取措施进行流量控制。流量控制的效果包括以下几种:快速失败、warm up、排队等待。
了解三种限流算法:计数器、漏桶、令牌桶 :https://www.aneasystone.com/archives/2020/08/spring-cloud-gateway-current-limiting.html

熔断降级文档:https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7
4)sentinel保护feign的远程调用-熔断降级:
参考:https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
在这里插入图片描述
调用方熔断:整合feign,在配置文件中开启sentinel熔断功能即可。编写feignclient接口与fallback方法实现类。sentinel感知到远程服务故障(统计错误次数),就熔断,调用fallback方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
调用方手动指定熔断策略:
在这里插入图片描述
通常在调用方熔断处理。
也可以在被调方做一个降级处理,在被调方做降级,通常是考虑到全局流量过大,不得不让被调方返回降级数据。

5)网关流控 https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81
在这里插入图片描述
在这里插入图片描述

网关限流规则:和别的流控规则差别很大
定制网关流控返回:

3 限流:

何为限流,为什么做限流:
限流就是对请求的速率进行限制,避免瞬时的大量请求击垮软件系统。毕竟,软件系统的处理能力是有限的。如果说超过了其处理能力的范围,软件系统可能直接就挂掉了。
监控应用流量的QPS或并发线程数等指标,当达到指定阈值时对流量进行控制。

限流算法:
计数器算法(固定窗口、滑动窗口-不太理解)、漏桶算法、令牌桶算法

限流实现:

单机限流:

Google Guava 自带的限流工具类 RateLimiter 。 RateLimiter 基于令牌桶算法,可以应对突发流量。
Resilience4j 不仅提供限流,还提供了熔断、负载保护、自动重试等保障系统高可用开箱即用的功能。并且,Resilience4j 的生态也更好,很多网关(spring cloud gateway)都使用 Resilience4j 来做限流熔断的。
因此,在绝大部分场景下 Resilience4j 或许会是更好的选择。如果是一些比较简单的限流场景的话,Guava 或者 Bucket4j 也是不错的选择。

分布式限流:

借助中间件限流 :可以借助 Sentinel 或者使用 Redis 来自己实现对应的限流逻辑。
网关层限流 :是比较常用的一种方案。不过,通常网关层限流通常也需要借助到中间件/框架
就比如 Spring Cloud Gateway 的分布式限流实现RedisRateLimiter就是基于 Redis+Lua 来实现的,再比如 Spring Cloud Gateway 还可以整合 Sentinel 来做限流。
如果你要基于 Redis 来手动实现限流逻辑的话,建议配合 Lua 脚本来做。网上也有很多现成的脚本供你参考,就比如 Apache 网关项目 ShenYu 的 RateLimiter 限流插件就基于 Redis + Lua 实现了令牌桶算法/并发令牌桶算法、漏桶算法、滑动窗口算法。

4 降级和熔断:

降级:

降级就是为了解决资源不足和访问量增加的矛盾。在有限的资源情况下,为了能抗住大量的请求(服务器压力剧增时),就需要对系统做出一些牺牲。放弃一些功能,保证整个系统能平稳运行
如何降级:
强一致性变成最终一致性;停止访问不重要的功能,从而释放出更多的资源;简化功能流程,把一些功能简化掉,比直接停止访问更好。
降级需要考虑的问题:
对业务进行仔细的梳理和分析,哪些是核心流程必须保证的,哪些是可以牺牲的;考虑什么指标下能进行降级,吞吐量、响应时间、失败次数等达到一个阈值才进行降级处理。

熔断:

熔断模式可以防止应用程序不断地尝试可能超时和失败的服务,能达到应用程序执行而不必等待下游服务修正错误服务。熔断一般是指当依赖的外部接口出现故障时,断绝和外部接口之间的关联,返回一个降级的数据。
熔断器能够记录容易出错的操作调用发生的错误次数,并根据失败率,自我决定是否继续调用还是熔断。
熔断器根据经验判断被调方故障,进而触发系统的主动规则
在这里插入图片描述

注:常用的流量控制熔断降级框架是Netflix Hystrix和alibaba Sentinel。

5 超时和重试:

请求时长超出某个阈值得不到响应时,抛出异常。
合理设置失败重试的次数。

6 异步调用:

异步调用借助消息队列,在用户请求完成之后就返回结果,异步处理请求,待处理完成后,再通过短信或者邮件通知。为了可用性,允许系统返回中间状态,牺牲强一致性,保证最终一致性。

7 增加缓存:

如果系统并发量很高,当突然有大量请求直接打到数据库上,可能会导致数据库宕机,此时可以给数据库加缓存。比如redis最大的特点就是速度快,将热点数据存入内存,极大地提高并发量。

8 容灾备份和异地多活:

传统灾备:做好重要数据的备份。建立多个完全相同的系统,当某个地方的系统挂掉,切换到另外的系统,继续提供服务。
异地多活:在异地部署多个服务,所有站点同时对外提供服务,即多活。

同城灾备:抵御「机房」级别的风险。
异地多活:抵御「城市」级别的风险。

参考:异地多活

灰度发布:(金丝雀发布)

逐步发布。
灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
灰度期:灰度发布开始到结束期间的这一段时间,称为灰度期。
每天只发布一部分,持续几天才把整个集群发布完毕。观察是否运行稳定、有无故障,期间如果发现问题,只需回滚已经发布的部分。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值