# 095. 开发品牌名称获取接口的基于本地缓存的 fallback 降级机制

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

按照流程来说,应该讲解断路器,但是为了讲解方便,把 fallback 提前了

因为只要是异常,都会调用 fallback ,如:

  • 访问外部接口服务报错,访问 mysql、redis 等外部依赖报错

  • 资源隔离被拒绝(reject)

  • 访问外部依赖超时(timeout)

  • 断路器被打开 断路器被打开不属于异常了,应该属于高可用的一个机制

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

那么 hystrix 中怎么开启降级机制的呢?

# Hystrix fallback 的写法

public class CommandThatFailsFast extends HystrixCommand<String> {

    private final boolean throwException;

    public CommandThatFailsFast(boolean throwException) {
        super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
        this.throwException = throwException;
    }

    @Override
    protected String run() {
        if (throwException) {
            throw new RuntimeException("failure from CommandThatFailsFast");
        } else {
            return "success";
        }
    }

    // 重写 getFallback 方法
    @Override
    protected String getFallback() {
        return "降级机制";
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

如果是 HystrixObservableCommand 则

@Override
  protected Observable<String> resumeWithFallback() {
      if (throwException) {
          return Observable.error(new Throwable("failure from CommandThatFailsFast"));
      } else {
          return Observable.just("success");
      }
  }
1
2
3
4
5
6
7
8

测试,如下代码,如果没有降级机制的话,这个调用不可能走到 System.out.println(execute) 这行代码

@Test
public void testFailure() {
    String execute = new CommandThatFailsFast(true).execute();
    System.out.println(execute);
}
1
2
3
4
5

# fallback 使用场景

对于 fallback 的使用场景视频中也没有什么干货讲解,最后讲解了一个获取商品品牌信息的场景,如下

  1. 调用商品信息后,再去调用服务获取商品品牌信息

  2. 当品牌信息调用失败后,在 fallback 中获取一份在本地缓存保存的品牌数据

    该品牌数据名称可能是落后的,也就是实际品牌名称为 ip7,本地缓存的名称为 ip

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

所以对于 hystrix 这种框架的时候,我觉得重点应该是使用场景,而不是官网教程中都已经很详细的教程

对于使用场景我唯一能想到的可能是游戏中的个人头像,个人喜欢玩游戏,但是有这么一个有趣的现象: 有时候个人信息的头像图片是不准确的,也就是不是自己设置的;

对于这个又去的现象,我唯一能想到的原因可能是:

  1. 获取头像信息失败,降级返回的一个本地内存中的一张图片或者返回的一个默认图片
  2. 由于是图片信息,占用网络带宽巨大,在繁忙的时候,对于这个服务进行降级,随机获取本地已有的图片返会;这里说的繁忙是指可能大量超时,导致获取失败,那么这样一来就省略了去服务中获取一次的网络开销了