Hystrix面试 - 基于 timeout 机制为服务接口调用超时提供安全保护

一般来说,在调用依赖服务的接口的时候,比较常见的一个问题就是超时。超时是在一个复杂的分布式系统中,导致系统不稳定,或者系统抖动。出现大量超时,线程资源会被 hang 死,从而导致吞吐量大幅度下降,甚至服务崩溃。

你去调用各种各样的依赖服务,特别是在大公司,你甚至都不认识开发一个服务的人,你都不知道那个人的技术水平怎么样,对那个人根本不了解。

Peter Steiner 说过,"On the Internet, nobody knows you're a dog",也就是说在互联网的另外一头,你都不知道甚至坐着一条狗。

像特别复杂的分布式系统,特别是在大公司里,多个团队、大型协作,你可能都不知道服务是谁的,很可能说开发服务的那个哥儿们甚至是一个实习生。依赖服务的接口性能可能很不稳定,有时候 2ms,有时候 200ms,甚至 2s,都有可能。

如果你不对各种依赖服务接口的调用做超时控制,来给你的服务提供安全保护措施,那么很可能你的服务就被各种垃圾的依赖服务的性能给拖死了。大量的接口调用很慢,大量的线程被卡死。如果你做了资源的隔离,那么也就是线程池的线程被卡死,但其实我们可以做超时控制,没必要让它们全卡死。

TimeoutMilliseconds

在 Hystrix 中,我们可以手动设置 timeout 时长,如果一个 command 运行时间超过了设定的时长,那么就被认为是 timeout,然后 Hystrix command 标识为 timeout,同时执行 fallback 降级逻辑。

TimeoutMilliseconds 默认值是 1000,也就是 1000ms。

HystrixCommandProperties.Setter()..withExecutionTimeoutInMilliseconds(int)

TimeoutEnabled

这个参数用于控制是否要打开 timeout 机制,默认值是 true。

HystrixCommandProperties.Setter().withExecutionTimeoutEnabled(boolean)

实例 Demo

我们在 command 中,将超时时间设置为 500ms,然后在 run() 方法中,设置休眠时间 1s,这样一个请求过来,直接休眠 1s,结果就会因为超时而执行降级逻辑。

public class GetProductInfoCommand extends HystrixCommand<ProductInfo> {private Long productId;private static final HystrixCommandKey KEY = HystrixCommandKey.Factory.asKey("GetProductInfoCommand");public GetProductInfoCommand(Long productId) {super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ProductInfoService")).andCommandKey(KEY).andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter().withCoreSize(8).withMaxQueueSize(10).withQueueSizeRejectionThreshold(8)).andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withCircuitBreakerEnabled(true).withCircuitBreakerRequestVolumeThreshold(20).withCircuitBreakerErrorThresholdPercentage(40).withCircuitBreakerSleepWindowInMilliseconds(3000)// 设置是否打开超时,默认是true.withExecutionTimeoutEnabled(true)// 设置超时时间,默认1000(ms).withExecutionTimeoutInMilliseconds(500).withFallbackIsolationSemaphoreMaxConcurrentRequests(30)));this.productId = productId;}@Overrideprotected ProductInfo run() throws Exception {System.out.println("调用接口查询商品数据,productId=" + productId);// 休眠1sTimeUtils.sleep(1);String url = "http://localhost:8081/getProductInfo?productId=" + productId;String response = HttpClientUtils.sendGetRequest(url);System.out.println(response);return JSONObject.parseObject(response, ProductInfo.class);}@Overrideprotected ProductInfo getFallback() {ProductInfo productInfo = new ProductInfo();productInfo.setName("降级商品");return productInfo;}
}

在测试类中,我们直接发起请求。

@SpringBootTest
@RunWith(SpringRunner.class)
public class TimeoutTest {@Testpublic void testTimeout() {HttpClientUtils.sendGetRequest("http://localhost:8080/getProductInfo?productId=1");}
}

结果中可以看到,打印出了降级商品相关信息。

ProductInfo(id=null, name=降级商品, price=null, pictureList=null, specification=null, service=null, color=null, size=null, shopId=null, modifiedTime=null, cityId=null, cityName=null, brandId=null, brandName=null)
{"id": 1, "name": "iphone7手机", "price": 5599, "pictureList":"a.jpg,b.jpg", "specification": "iphone7的规格", "service": "iphone7的售后服务", "color": "红色,白色,黑色", "size": "5.5", "shopId": 1, "modifiedTime": "2017-01-01 12:00:00", "cityId": 1, "brandId": 1}

转载来源:https://github.com/doocs/advanced-java/blob/master/docs/high-availability/hystrix-timeout.md

Hystrix面试 - 基于 timeout 机制为服务接口调用超时提供安全保护相关推荐

  1. 基于反射机制的服务代理调用

    转载自http://blog.csdn.net/zhu_tianwei/article/details/18082045 实现原理:通过传递服务bean的名称.执行的方法及参数,通过反射机制进行调用返 ...

  2. Hystrix面试 - 基于 Hystrix 信号量机制实现资源隔离

    Hystrix面试 - 基于 Hystrix 信号量机制实现资源隔离 Hystrix 里面核心的一项功能,其实就是所谓的资源隔离,要解决的最最核心的问题,就是将多个依赖服务的调用分别隔离到各自的资源池 ...

  3. Hystrix面试 - 基于本地缓存的 fallback 降级机制

    Hystrix面试 - 基于本地缓存的 fallback 降级机制 Hystrix 出现以下四种情况,都会去调用 fallback 降级机制: 断路器处于打开的状态. 资源池已满(线程池+队列 / 信 ...

  4. Hystrix面试 - 基于 request cache 请求缓存技术优化批量商品数据查询接口

    Hystrix面试 - 基于 request cache 请求缓存技术优化批量商品数据查询接口 Hystrix command 执行时 8 大步骤第三步,就是检查 Request cache 是否有缓 ...

  5. Hystrix面试 - 基于 Hystrix 线程池技术实现资源隔离

    Hystrix面试 - 基于 Hystrix 线程池技术实现资源隔离 上一讲提到,如果从 Nginx 开始,缓存都失效了,Nginx 会直接通过缓存服务调用商品服务获取最新商品数据(我们基于电商项目做 ...

  6. python的坐标代码_基于Python的地图坐标服务接口调用代码实例

    代码描述:基于Python的地图坐标服务接口调用代码实例 关联数据:地图坐标服务 接口地址:http://www.juhe.cn/docs/api/id/32 #!/usr/bin/python # ...

  7. 手把手教你搭建SpringCloud项目(九)集成OpenFeign服务接口调用

    Spring Cloud全集文章目录: 零.什么是微服务?一看就会系列! 一.手把手教你搭建SpringCloud项目(一)图文详解,傻瓜式操作 二.手把手教你搭建SpringCloud项目(二)生产 ...

  8. python短信接口_基于 python 的短信接口调用代码示例模板

    阅信短信验证码平台最近会从新梳理基于不同语言的短信接口调用代码示例,是为了迎合市面上现在流行的各个语言代码实现,也是为了能够更好的服务满足客户的不同层次的需求. 下面的代码是基于 python 的短信 ...

  9. 基于百度云的 AI 接口调用

    基于百度云的 AI 接口调用   人工智能(Artificial Intelligence),英文缩写为AI.它是研究.开发用于模拟.延伸和扩展人的智能的理论.方法.技术及应用系统的一门新的技术科学. ...

最新文章

  1. 尝试优化骨骼动画计算的意外收获——使用嵌入式汇编对float转int进行优化
  2. 51标准c语言语句范例,51单片机C语言编程100例
  3. 二进制bit0是什么意思_模拟信号是什么 模拟信号数字传输原理介绍【图文】
  4. amt630a芯片中文资料_甲基化芯片学习记录
  5. Java IO: RandomAccessFile
  6. 如何用python画组合图形_python结合G2绘制精美图形
  7. OPPO 正式发布 ColorOS 7,“轻”装上阵带来多项亮眼新功能……
  8. 【Java虚拟机】运行时数据区
  9. AndroidStudio_AndroidStudio debug的时候断点打不上_No executable code found at line---Android原生开发工作笔记236
  10. location定位_javascript自学记录:location对象
  11. linux-查找某目录下包含关键字内容的文件
  12. G2 可视化引擎-统计图表
  13. go语言之进阶篇字符串转换
  14. linux增加分区大小,新增硬盘扩容Linux下的分区大小
  15. 掌握这2个关键点,轻松摆脱沉迷游戏的现状(醍醐灌顶)
  16. Java的class是什么意思?
  17. CUDA +cnn安装
  18. 2015 iMac如何绕过TMP安装Windows11(不用Parallels虚拟机实现macOS与Windows11双系统)
  19. js颜色加深或者减淡
  20. 盛天海科技:拼多多团长这样来做

热门文章

  1. Magento: 解决 Bootstrap 3 与prototype并用的时候, 下拉菜单消失的问题 Bootstrap 3 dropdown menu dis...
  2. ubuntu cheat sheet 目录结构
  3. 可编辑的表格:jQuery+PHP实现实时编辑表格字段内容
  4. Flex mp3播放
  5. nginx优缺点 优化
  6. C++—— cin输入流详解
  7. Java——volatile关键字详解
  8. 【C++基础学习】C++引用参数与指针参数
  9. TreeView控件 1202
  10. git-版本的创建与版本的切换操作