大厂互联网电商基于本地缓存的fallback降级机制

0 执行流程

  1. 创建command
  2. 执行command
  3. request cache
  4. 短路器,如果打开了,fallback降级机制

1 fallback降级触发 case

  • Hystrix调用各种接口或访问外部依赖,MySQL,Redis,ZooKeeper,Kafka等出现任何异常,如访问报错
  • 对每个外部依赖,无论是服务接口,中间件,资源隔离,对外部依赖只能用一定量的资源去访问,线程池/信号量等资源池已满
  • reject访问外部依赖时,访问时间过长,可能就会导致超时,报一个TimeoutException异常
  • 对外部依赖的东西访问时出现异常,发送异常事件到短路器中去进行统计
    短路器发现异常事件的占比达到一定比例,直接开启短路(circuit breaker)

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

2 实现方案

2.1 纯内存数据

在内存中维护一个本地缓存,作为基于LRU自动清理的纯内存缓存,数据也可放入缓存。
若外部依赖异常,fallback这里,直接尝试从本地缓存获取数据。

2.2 默认值

本来你是从mysql,redis获取数据,获取调用其他服务的接口的,结果它故障,fallback,可返回一个默认值。run()抛出异常,超时,线程池或信号量满了,或短路了,都会调用fallback机制。

3 案例

有个商品数据,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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值