大厂互联网电商基于本地缓存的fallback降级机制
发布日期:2021-06-30 12:35:53
浏览次数:2
分类:技术文章
本文共 1733 字,大约阅读时间需要 5 分钟。
执行流程
- 创建command
- 执行command
- request cache
- 短路器,如果打开了,fallback降级机制
1 fallback降级机制
- Hystrix调用各种接口,或者访问外部依赖,MySQL,Redis,ZooKeeper,Kafka等,出现任何异常的情况,比如访问报错
- 对每个外部依赖,无论是服务接口,中间件,资源隔离,对外部依赖只能用一定量的资源去访问,线程池/信号量等资源池已满
- reject访问外部依赖的时候,访问时间过长,可能就会导致超时,报一个TimeoutException异常,timeout
- 对外部依赖的东西访问的时候出现了异常,发送异常事件到短路器中去进行统计 如果短路器发现异常事件的占比达到了一定比例,直接开启短路(circuit breaker)
上述四种情况,都会去调用fallback降级机制
fallback,你之前都是必须去调用外部的依赖接口,或者从MySQL中去查询数据的,但是为了避免说可能外部依赖会有故障2 实现方案
2.1 纯内存数据
可以在内存中维护一个ECache,作为基于LRU自动清理的纯内存缓存,数据也可放入缓存
如果说外部依赖有异常,fallback这里,直接尝试从ECache中获取数据2.2 默认值
本来你是从mysql,redis,或者其他任何地方去获取数据的,获取调用其他服务的接口的,结果人家故障了,人家挂了,fallback,可以返回一个默认值
run()抛出异常,超时,线程池或信号量满了,或短路了,都会调用fallback机制
案例
现在有个商品数据,brandId,品牌,假设拿到了一个商品数据以后,用brandId再调用一次请求,到其他的服务去获取品牌的最新名称
假如那个品牌服务挂掉了,那么我们可以尝试本地内存中,会保留一份时间比较过期的一份品牌数据,有些品牌没有,有些品牌的名称过期了,调用品牌服务失败了,fallback降级就从本地内存中获取一份过期的数据,先凑合着用着
public class CommandHelloFailure extends HystrixCommand{ 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 + "!"; }}@Testpublic 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)
转载地址:https://javaedge.blog.csdn.net/article/details/95937463 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月21日 20时20分48秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Impala 3.4的新功能和社区进展
2019-04-30
错误的locale设置导致Impala crash
2019-04-30
在CDH6.3中单独升级Impala到Apache Impala 3.4
2019-04-30
如何参与Impala社区的讨论
2019-04-30
记一次曲折的Debug经历
2019-04-30
Impala支持Google云存储开发笔记
2019-04-30
如何在Apache JIRA中搜索issue
2019-04-30
Impala-shell相关源码笔记
2019-04-30
Windows下配置Storm源码阅读环境(vim+ctags)
2019-04-30
Storm源码细读——Nimbus启动
2019-04-30
Storm源码细读——Supervisor启动
2019-04-30
scrapy 排错记录
2019-04-30
Titan线程隔离的验证
2019-04-30
Titan源码阅读——如何透明地支持多线程事务隔离
2019-04-30
HBase Snapshot解析
2019-04-30
Impala源码阅读——SimpleScheduler
2019-04-30
统计Titan图中的点数和边数
2019-04-30
Presto基本概念
2019-04-30
Presto源码阅读——如何获取Hive中的Metadata(HMS+HDFS)
2019-04-30