首页 > 其他分享 >6、基于本地缓存的 fallback 降级机制

6、基于本地缓存的 fallback 降级机制

时间:2023-05-26 19:14:15浏览次数:34  
标签:降级 缓存 name 依赖 调用 报错 fallback

1、fallback降级机制

hystrix调用各种接口,或者访问外部依赖,mysql,redis,zookeeper,kafka,等等,如果出现了任何异常的情况

  • 比如说报错了,访问mysql报错,redis报错,zookeeper报错,kafka报错,error
  • 对每个外部依赖,无论是服务接口,中间件,资源隔离,对外部依赖只能用一定量的资源去访问,线程池/信号量,如果资源池已满,reject
  • 访问外部依赖的时候,访问时间过长,可能就会导致超时,报一个TimeoutException异常,timeout

上述三种情况,都是我们说的异常情况,对外部依赖的东西访问的时候出现了异常,发送异常事件到短路器中去进行统计

  • 如果短路器发现异常事件的占比达到了一定的比例,直接开启短路,circuit breaker

上述四种情况,都会去调用fallback降级机制

fallback,降级机制,你之前都是必须去调用外部的依赖接口,或者从mysql中去查询数据的,但是为了避免说可能外部依赖会有故障

比如,你可以再内存中维护一个ehcache,作为一个纯内存的基于LRU自动清理的缓存,数据也可以放入缓存内

如果说外部依赖有异常,fallback这里,直接尝试从ehcache中获取数据

比如说,本来你是从mysql,redis,或者其他任何地方去获取数据的,获取调用其他服务的接口的,结果人家故障了,人家挂了,fallback,可以返回一个默认值

两种最经典的降级机制:纯内存数据,默认值

run()抛出异常,超时,线程池或信号量满了,或短路了,都会调用fallback机制

给大家举个例子,比如说我们现在有个商品数据,brandId,品牌,一般来说,假设,正常的逻辑,拿到了一个商品数据以后,用brandId再调用一次请求,到其他的服务去获取品牌的最新名称

假如说,那个品牌服务挂掉了,那么我们可以尝试本地内存中,会保留一份时间比较过期的一份品牌数据,有些品牌没有,有些品牌的名称过期了

调用品牌服务失败了,fallback降级就从本地内存中获取一份过期的数据,先凑合着用着

public class CommandHelloFailure extends HystrixCommand<String> {

    private final String name;

    public CommandHelloFailure(String name) {
        super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
        this.name = name;
    }

    @Override
    protected String run() {
        throw new RuntimeException("this command always fails");
    }

    @Override
    protected String getFallback() {
        return "Hello Failure " + name + "!";
    }

}

@Test
public void testSynchronous() {
    assertEquals("Hello Failure World!", new CommandHelloFailure("World").execute());
}

HystrixObservableCommand,是实现resumeWithFallback方法

2、fallback.isolation.semaphore.maxConcurrentRequests

这个参数设置了HystrixCommand.getFallback()最大允许的并发请求数量,默认值是10,也是通过semaphore信号量的机制去限流

如果超出了这个最大值,那么直接被reject

HystrixCommandProperties.Setter()
   .withFallbackIsolationSemaphoreMaxConcurrentRequests(int value)

标签:降级,缓存,name,依赖,调用,报错,fallback
From: https://www.cnblogs.com/huigui-mint/p/17435592.html

相关文章

  • C++文件流结构体序列化,并查集,LRU缓存
    c语言中的文件操作中用fprintf将数据写入到文件中,用fscanf将文件读入内存中,而c++中也有ostream和istream作为键盘流输入,屏幕流输出,对于文件也有ofstream/istream来进行相关的操作.如图:图中表示将一个结构体的的数据输入到文件中,并从文件中读取数据,并用得到的数据初始化一......
  • 如何防止缓存被击穿
    在什么情况下缓存会被击穿高并发应用场景中,当大量请求同时请求同个key,这个key便会失效了,这就使得数据库被超量的请求直接访问。此现象就是缓存击穿,其后果会导致数据库压力陡增。使用singleflight阻止同时请求请求1、2、3同时请求相同的key,singleflight机制只会让请求1访问DB,请......
  • 跟我一起探索 HTTP-HTTP缓存
    概览HTTP缓存会存储与请求关联的响应,并将存储的响应复用于后续请求。可复用性有几个优点。首先,由于不需要将请求传递到源服务器,因此客户端和缓存越近,响应速度就越快。最典型的例子是浏览器本身为浏览器请求存储缓存。此外,当响应可复用时,源服务器不需要处理请求——因为它不需要解......
  • Redis中的缓存穿透|缓存击穿|缓存雪崩
    Redis是一种内存数据库,也就是说,它是一种存储在内存中的数据库.相当于Redis是提供一种缓存服务,提供这种缓存服务的有很多种,包括Redis,MongoDB等,其中国内用的最多的最常见的可能就是Redis既然是缓存服务,那么就可能存在缓存穿透,缓存击穿和缓存雪崩的现象存在,现在我们来分别详细描......
  • 3种分页列表缓存方式,速收藏~
    摘要:本文介绍了实现分页列表缓存的三种方式。本文分享自华为云社区《分页列表缓存,你真的会吗》,作者:勇哥java实战分享。1直接缓存分页列表结果显而易见,这是最简单易懂的方式。我们按照不同的分页条件来缓存分页结果,伪代码如下:publicList<Product>getPageList(String......
  • 把yum安装的rpm包缓存成离线包
    1.编辑yum配置文件保证缓存在/etc/yum.conf文件中,将keepcache=0改为keepcache=12.以安装nginx为例yuminstallnginx-y3.安装过程中可以得到下载仓库位置和依赖包信息4.在指定仓库中提取nginx和依赖包5.为确保得到的软件包正常,每次安装软件前先把之前缓存的软件......
  • 2023-05-24:为什么要使用Redis做缓存?
    2023-05-24:为什么要使用Redis做缓存?答案2023-05-24:缓存的好处买啤酒和喝啤酒的例子可以帮助我们理解缓存的好处。假设你在超市里买了一箱啤酒,如果你需要每次想喝啤酒就去超市购买,无疑会浪费很多时间和精力。而如果你将一部分啤酒放在家中的冰箱里,每次想喝啤酒时就从冰箱里取出来,那......
  • 【异常】This application has no explicit mapping for /error, so you are seeing t
    本文目录一、错误提示二、错误原因2.1原因一:启动类的位置不对2.2原因二:控制器的URL路径书写问题 2.3原因三:配置文件中视图解析器的配置问题三、解决方案3.1解决方案一3.2解决方案二3.3解决方案三背景:使用springboot+vue构建的微信点餐系统一、错误提示最近在做一个项目,......
  • 2023-05-24:为什么要使用Redis做缓存?
    2023-05-24:为什么要使用Redis做缓存?答案2023-05-24:缓存的好处买啤酒和喝啤酒的例子可以帮助我们理解缓存的好处。假设你在超市里买了一箱啤酒,如果你需要每次想喝啤酒就去超市购买,无疑会浪费很多时间和精力。而如果你将一部分啤酒放在家中的冰箱里,每次想喝啤酒时就从冰箱里取出......
  • Hystrix(服务熔断)+Feign和FallbackFactory(服务降级)
    分布式系统面临的服务雪崩问题当用户发起请求时,假设处理请求的服务器1运行时需要调用到服务器2,服务器2运行时需要调用到服务器3,而如果服务器2因为某些原因始终不能正常调用到服务器3,这时候后面其他用户的请求也都会阻塞在服务器1,在并发量极大的情况下容易导致多个服务器崩溃已经......