目录
限流
拦截经过网关的请求的数量,一般用于控制短时间内大量请求的情况,通过制定规则来实现。一般限制异常请求。
解决办法
程序架构分层合理的话限流功能在网关层次制定限流策略做全局处理。
熔断
正常请求短时间内超过程序设置的能处理请求的最大阈值,达到后程序无法继续进行请求处理。
用于调用依赖的子服务在指定的时间内无响应的情况,在程序端处理。
强调的是调用依赖的服务或者中间件超过日常处理负荷或者出现异常的情况。
解决办法
熔断问题在cpu计算上不会出现,因为计算速度很快,问题一般在处理io上,有三种情况
数据库访问
有两种情况
关系型数据库
- 表索引设计不合理,查看sql的查询计划,查看sql是否走了索引,如果走了索引是否充分利用或者修改sql
- 数据库连接慢,利用数据库连接池,设置合理的参数。
elasticsearch
对于那种保存的数据不需要马上查询的可以使用默认的索引刷新策略。
网络请求
内部服务调用
http 调用改为 rpc 调用
远程网络调用
设置超时时间,如果在指定的时间内没有响应暂存到数据库,过一段时间后再次重试。
压缩处理
针对文件压缩,需要使用crc32算法检验,确定使用机器的处理器是否是 intel厂家,是否支持see 4.2指令集,开发语言为 java 的话使用 java 9及以上版本,对crc32进行了重写,最大程度可以充分利用处理器。
降级
两种情况
物理问题导致处理能力下降(服务器的磁盘损坏),按照请求数量的百分比级别进行请求放行
在资源有限的情况下,当前服务非核心,减少资源消耗。让出更多的资源让核心服务来使用。
解决的是资源不足和访问量增加的矛盾,在有限的资源情况下,可以应对高并发大量请求。那么在有限的资源情况下,想要处理大批量的请求就需要对一些服务功能进行一些限制,放弃一些功能,保证整个系统能够平稳运行。退而求其次,做了妥协。
总结
限流位于熔断前面。其实限流功能做的好的话不应该出现熔断的情况。举一个例子,外来物种入侵一般是因为海关处没做严格检查的缘故,门没把严。
三者主要做了一件事,就是在有限的硬件资源内确保正常运行的系统能正常运转,如果运行状态异常(超出了负荷)就要采取措施来处理到达的请求。
对于运行最大负荷需要使用工具对使用的组件做对应的压力测试,查找问题的瓶颈,对使用的组件进行参数调整,比较在不同参数下的运行情况,寻找最适合的参数,使现有的软件系统能处理更多的请求,使用的各个组件在运行过程中达到最大性能,确保可以达到在成本有限的情况下充分压榨机器的使用情况。
对于高并发的应用需要制定对应的限流策略,所有的请求过来不能无脑接收。
还需要结合监控预警通知来处理这些问题。
例子
上述三者功能可以用一个生活中的例子来讲
一家工厂有多条流水线生产商品对外出售,订单正常的话一切井然有序。
有一天突然来了一辆大货车拉货超过了厂区的空地,门口保安(网关)看到这个情况就说进不去(限流)。
有一天突然工厂接了日常产量十倍的订单,但是现有的生产线无法满足这么大的产量(熔断),工厂领导跟客户商量需要等时间才行。
有一天突然有一条生产线出问题了,工厂的人员不知道怎么处理,只能使用能用的生产线继续生产(降级),等到维修好后再使用。
有三条流水线,但是生产的产品里有赚钱多的和赚钱少的,但是赚钱少的对于交付时间不敏感,经过工厂领导决定,开两条生产赚钱多的,一条生产赚钱少的(降级),虽然慢但是不影响客户的要求。
参考链接
https://baijiahao.baidu.com/s?id=1763751716542246710
https://blog.csdn.net/BruceLiu_code/article/details/129122169