谈谈美股熔断和服务熔断Hystrix

2024-03-04 09:50

本文主要是介绍谈谈美股熔断和服务熔断Hystrix,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先说一下最近比较火热的美股熔断,美股熔断究竟是什么意思?

先看看维基百科:

熔断机制(英语:Circuit breaker / Trading curb)指的是在股票市场的交易时间中,当价格波动的幅度达到某一个限定的目标(熔断点)时,对其暂停交易一段时间的机制。此机制如同保险丝在电流过大时候熔断比较相似,故而得名。熔断机制推出的目的是为了防范,给市场更多的冷静时间,避免恐慌情绪蔓延导致市场波动,从而防止大规模股价下跌现象的发生。然而熔断机制也因切断了资金的流通性,同样会造成市场情绪加大,并令市场风险在熔断期结束后继续扩大;

美国指数熔断机制的基准指数为标普500(标普500是由道琼斯指数延申而来,是一个由1957年起记录美国股市的平均记录,观察范围达美国的500家上市公司,与道琼斯指数相比,标准普尔500包含的公司更多,因此风险更为分散,能够反映更广泛的市场变化)单项跌幅阈值为7%、13%、20%。当指数较前一天收盘点位下跌7%、13%时,全美证券市场交易将暂停15分钟,当指数较前一天收盘点位下跌20%时,当天交易停止;

这就类似于我们的服务熔断,在一个高度服务化的系统中,我们实现的一个业务逻辑通常会依赖多个服务,比如:
商品详情展示服务会依赖商品服务, 价格服务, 商品评论服务;如果此时商品评论服务的健康状况低于设定阈值那么熔断就会打开,请求在一段时间内(这个一段时间可以说是美国证券交易所暂停15,其实在我们的服务中关闭时间是没有那么长的,这里只是比喻)就不会再去调用商品评论服务,而是直接返回错误信息或者执行降级策略,当5s(默认)之后断路器自动切换到半开路状态,会放进来几个请求,观察请求的返回情况,如果请求成功断路器切回闭路状态,否则重新切换到开路状态;其实无论是美股的熔断还是我们的服务熔断道理都是一样的;技术来源于生活!

下面我们来详细说一下服务熔断;

服务雪崩

服务雪崩效应是一种因 服务提供者 的不可用导致 服务调用者 的不可用,并将不可用 逐渐放大 的过程;

下图中,A为服务的调用者,B是A的服务提供者,C是B的服务提供者,当C的不可用,引起B的不可用,并将不可用逐渐放大A时, 造成了整体的不可用服务雪崩就形成了.

image.png

服务雪崩的每个阶段都可能由不同的原因造成, 比如造成 服务不可用 的原因有:

  • 硬件故障

  • 程序Bug

  • 缓存击穿

  • 用户大量请求

硬件故障和程序Bug就不多解释了,说一说缓存击穿和用户大量请求,

缓存击穿:

缓存击穿一般发生在缓存应用重启, 所有缓存被清空时,以及短时间内大量缓存失效时. 大量的缓存不命中, 使请求直击后端,造成服务提供者超负荷运行,引起服务不可用. 在秒杀和大促开始前,如果准备不充分,用户发起大量请求也会造成服务提供者的不可用.

用户大量的请求

在服务提供者不可用后, 用户由于忍受不了界面上长时间的等待,而不断刷新页面甚至提交表单. 服务调用端的会存在大量服务异常后的重试逻辑. 这些重试都会进一步加大请求流量.

那服务的调用者会不会也不可用,当然,当服务调用者使用同步调用时, 会产生大量的等待线程占用系统资源. 一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态;

服务雪崩的应对策略
  • 流量控制
  • 改进缓存模式
  • 服务自动扩容
  • 服务调用者降级服务

这里简单说一下啊降级!

服务调用者降级服务:

  资源隔离不可用服务的调用快速失败

资源隔离主要是对调用服务的线程池进行隔离.

不可用服务的调用快速失败一般通过 超时机制, 熔断器 和熔断后的降级方法来实现.

例如接下来我们会说到Hystrix,其中Fallback相当于是降级操作. 对于查询操作, 我们可以实现一个fallback方法, 当请求后端服务出现异常的时候, 可以使用fallback方法返回的值. fallback方法的返回值一般是设置的默认值或者来自缓存.

使用Hystrix预防雪崩

在Hystrix中, 主要通过线程池来实现资源隔离. 通常在使用的时候我们会根据调用的远程服务划分出多个线程池. 例如调用产品服务的Command放入A线程池, 调用账户服务的Command放入B线程池. 这样做的主要优点是运行环境被隔离开了. 这样就算调用服务的代码存在bug或者由于其他原因导致自己所在线程池被耗尽时, 不会对系统的其他服务造成影响. 但是带来的代价就是维护多个线程池会对系统带来额外的性能开销. 如果是对性能有严格要求而且确信自己调用服务的客户端代码不会出问题的话, 可以使用Hystrix的信号模式(Semaphores)来隔离资源.

例如:

在一个高度服务化的系统中,我们实现的一个业务逻辑通常会依赖多个服务,比如: 商品详情展示服务会依赖商品服务, 价格服务, 商品评论服务. 如图所示:

image.png

调用三个依赖服务会共享商品详情服务的线程池. 如果其中的商品评论服务不可用, 就会出现线程池里所有线程都因等待响应而被阻塞, 从而造成服务雪崩. 如图所示:

image.png

Hystrix通过将每个依赖服务分配独立的线程池进行资源隔离, 从而避免服务雪崩. 如下图所示, 当商品评论服务不可用时, 即使商品服务独立分配的20个线程全部处于同步等待状态,也不会影响其他依赖服务的调用.

image.png

创建 hystrix-consumer-service

引入依赖:

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>0.9.0.RELEASE</version></dependency></dependencies>

使用nacos作为服务注册发现;其中openfeign中已经包含了hystrix的依赖;

配置文件:

server.port=8765
spring.application.name=service-hystrix
#开启熔断,默认为false
feign.hystrix.enabled=true
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

创建CaseServiceClient:

@FeignClient(value = "service-say",fallbackFactory = CaseServiceFallback.class )
public interface CaseServiceClient {@RequestMapping(value = "/say",method = RequestMethod.GET)String sayFromClient(@RequestParam(value = "name") String name);
}

有很多案例中都是使用fallback,这里我使用的是fallbackFactory,这两个的区别是fallbackFactory可以返回失败的原因;例如下面的throwable

创建fallback:

@Component
public class CaseServiceFallback implements FallbackFactory<CaseServiceClient> {@Overridepublic CaseServiceClient create(Throwable throwable) {return new CaseServiceClient() {@Overridepublic String sayFromClient(String name) {return "sorry " + name +" error cause: "+ throwable;}};}
}

编写一个Controller

@RestController
public class CaseController{@AutowiredCaseServiceClient caseServiceClient;@GetMapping(value = "/hi")public String sayHi(@RequestParam String name) {return caseServiceClient.sayFromClient( name );}
}

在启动类上加上

@EnableFeignClients@EnableDiscoveryClient注解;

我们启动项目并浏览器访问 http://localhost:8765/hi?name=haoxy ,注意这时我们并没有启动hystrix-provider-service,因为还没有创建这个工程;

页面显示:

sorry haoxy error cause: java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have available server for client: service-say

创建 hystrix-provider-service工程

添加依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>0.9.0.RELEASE</version>
</dependency>

增加配置

server.port=8075
spring.application.name=service-say
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

创建Controller

@RestController
public class ProviderController {@Value("${server.port}")String port;@RequestMapping("/say")public String home(@RequestParam(value = "name", defaultValue = "haoxy") String name) {return "hi " + name + " ,i am from port:" + port;}
}

启动 hystrix-provider-service工程,并同样在浏览器访问: http://localhost:8765/hi?name=haoxy

页面显示:

hi haoxy ,i am from port:8075

源码地址:https://github.com/haoxiaoyong1014/springcloud-examples

这篇关于谈谈美股熔断和服务熔断Hystrix的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/772799

相关文章

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1

微服务中RPC的强类型检查与HTTP的弱类型对比

在微服务架构中,服务间的通信是一个至关重要的环节。其中,远程过程调用(RPC)和HTTP是两种最常见的通信方式。虽然它们都能实现服务间的数据交换,但在类型检查方面,RPC的强类型检查和HTTP的弱类型之间有着显著的差异。本文将深入探讨这两种通信方式在类型检查方面的优缺点,以及它们对微服务架构的影响。 一、RPC的强类型检查 RPC的强类型检查是其核心优势之一。在RPC通信中,客户端和服务端都使

中国341城市生态系统服务价值数据集(2000-2020年)

生态系统服务反映了人类直接或者间接从自然生态系统中获得的各种惠益,对支撑和维持人类生存和福祉起着重要基础作用。目前针对全国城市尺度的生态系统服务价值的长期评估还相对较少。我们在Xie等(2017)的静态生态系统服务当量因子表基础上,选取净初级生产力,降水量,生物迁移阻力,土壤侵蚀度和道路密度五个变量,对生态系统供给服务、调节服务、支持服务和文化服务共4大类和11小类的当量因子进行了时空调整,计算了

SpringCloud - 微服务

1、微服务介绍         参考: 微服务百度百科 1.1 概念         微服务(或称微服务架构)是一种云原生架构方法,在单个应用中包含众多松散耦合且可单独部署的小型组件或服务。 这些服务通常拥有自己的技术栈,包括数据库和数据管理模型;通过一个REST API、事件流和消息代理组合彼此通信;以及按照业务能力进行组织,具有通常称为有界上下文的服务分隔线。         微服务特

微服务(服务治理)

服务远程调用时存在的问题 注册中心原理 服务治理中的三个角色分别是什么? 服务提供者:暴露服务接口,供其它服务调用服务消费者:调用其它服务提供的接口注册中心:记录并监控微服务各实例状态,推送服务变更信息 消费者如何知道提供者的地址? 服务提供者会在启动时注册自己信息到注册中心,消费者可以从注册中心订阅和拉取服务信息 消费者如何得知服务状态变更? 服务提供者通过心

CloudStack管理员文档 - 服务方案

用户创建一个实例可以又很多个选项来设定该实例的特性和性能。CloudStack提供以下几种方式: 服务方案,由管理员定义,提供了CPU速度,CPU数量,内存大小,根磁盘的标签,以及其他选项磁盘方案,由管理员定义,为主存储提供了磁盘大小和IOPS的选项网络方案,由管理员定义, 计算和磁盘方案 服务方案是CPU,内存,磁盘等虚拟硬件特性的集合。管理员可以创建各种服务方案,终端用户在创建虚拟机的时

SpringCloud Hystrix初体验

文章目录 简介实验步骤bookstore应用初始化应用主程序应用配置访问应用 reading应用初始化应用主程序BookService应用配置运行应用 参考资料 简介 Hystrix是SpringCloud Netflix下的一个库,实现了Circuit Breaker(电路熔断器)模式。关于Circuit Breaker模式的原理,可以参考:Circuit Breaker(电

视频监控平台:支持交通部行业标准JT/T905协议(即:出租汽车服务管理信息系统)的源代码的函数和功能介绍及分享

目录 一、视频监控平台介绍 (一)概述 (二)视频接入能力介绍 (三)功能介绍 二、JT/T905协议介绍 (一)概述 (二)主要内容 1、设备要求 2、业务功能要求 3、技术功能要求 4、性能要求 5、接口要求 6、设备通信协议与数据格式 三、代码和解释 (一)代码和注释 (二)函数功能说明 1. 头文件保护 2. 包含必要的头文件 3. 引入命名空间std

构建高可用Java微服务架构的秘籍

构建高可用Java微服务架构的秘籍 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 随着云计算和分布式系统的快速发展,微服务架构已成为构建大型应用的首选方案之一。而在构建高可用的Java微服务架构时,开发者需要考虑诸多因素,包括服务发现、负载均衡、容错机制等。本文将分享一些构建高可用Java微服务架构的秘籍,帮助开发者更好地设

一、系统学习微服务遇到的问题集合

1、启动了nacos服务,没有在注册列表 应该是版本问题 Alibaba-nacos版本 nacos-文档 Spring Cloud Alibaba-中文 Spring-Cloud-Alibaba-英文 Spring-Cloud-Gateway 写的很好的一篇文章 在Spring initial上面配置 start.aliyun.com 重新下载 < 2、 No Feign Clie