hystrix熔断 简介_Hystrix简介–总结

hystrix熔断 简介

这是其他两篇文章的后续文章– 动机 ,说明为什么在分布式系统中需要类似Hystrix的内容以及Hystrix的基本介绍 。

这将是我的Hystrix旅程的总结,其中包含各种属性的详细信息,这些属性可以进行调整以更改Hystrix的行为,并涉及一些高级概念

调整Hystrix行为

Hystrix的配置在此Wiki中进行了解释,简要介绍了两个主要的组来控制Hystrix的属性,

  1. 命令属性
  2. ThreadPool属性

属性遵循Wiki中说明的优先顺序,这里我将重点介绍通过属性文件指定的属性。

对于示例命令,定义了以下方式:

public class HelloWorldCommand extends HystrixCommand<String> {private static final Logger logger = LoggerFactory.getLogger(HelloWorldCommand.class);private final String name;public HelloWorldCommand(String name) {super(HystrixCommandGroupKey.Factory.asKey("default"));this.name = name;}@Overrideprotected String run() throws Exception {logger.info("HelloWorld Command Invoked");return "Hello " + name;}
}

可以调整的第一个行为是在线程池中执行命令还是与调用方(SEMAPHORE策略类型)执行线程相同。 如果执行在线程池中,则可以设置请求超时。

hystrix.command.HelloWorldCommand.execution.isolation.strategy=THREAD
hystrix.command.HelloWorldCommand.execution.isolation.thread.timeoutInMilliseconds=1000

第二种行为是断路器,它根据在滚动时间窗内收集的信息进行工作,这种方式进行配置,例如持续10秒:

hystrix.command.HelloWorldCommand.metrics.rollingStats.timeInMilliseconds=10000

在此窗口中,如果某个百分比的故障(例如50%)发生在请求阈值(例如10秒内发生20个故障),则电路断开,其配置如下所示:

hystrix.command.HelloWorldCommand.circuitBreaker.requestVolumeThreshold=20
hystrix.command.HelloWorldCommand.circuitBreaker.errorThresholdPercentage=50

电路断开后,它将保持这种状态并保持以下设置的时间,在这种情况下为5秒:

hystrix.command.HelloWorldCommand.circuitBreaker.sleepWindowInMilliseconds=5000

线程池设置是使用指定的组密钥控制的,在本示例中称为默认组密钥。 不过,也可以将特定的“ Threadpool Key”指定为构造函数的一部分。

hystrix.threadpool.default.coreSize=10
hystrix.threadpool.default.queueSizeRejectionThreshold=5

在这里,可以并行运行10个命令,而其他5个则保留在队列中,超过该队列将拒绝请求。

要求折叠

Tomaz Nurkiewicz在他的博客网站NoBlogDefFound中做了出色的解释Request Collapsing的工作 。 我的示例有些简化,请考虑以下情况,其中有很多请求要检索给定id的Person,方法如下:

public class PersonService {public Person findPerson(Integer id) {return new Person(id, "name : " + id);}public List<Person> findPeople(List<Integer> ids) {return ids.stream().map(i -> new Person(i, "name : " + i)).collect(Collectors.toList());}
}

该服务以固定的响应进行响应,但假定该调用是对远程数据存储的。 还可以看到,该服务实现了一个批处理方法,以在给定ID列表的情况下检索人员列表。

请求折叠是一项功能,它将一段时间内发生的多个用户请求批量处理为一个这样的远程呼叫,然后将响应散发回用户。

可以通过以下方式定义采用一组id并获得人员响应的hystrix命令:

public class PersonRequestCommand extends HystrixCommand<List<Person>>{private final List<Integer> ids;private final PersonService personService = new PersonService();private static final Logger logger = LoggerFactory.getLogger(PersonRequestCommand.class);public PersonRequestCommand(List<Integer> ids) {super(HystrixCommandGroupKey.Factory.asKey("default"));this.ids = ids;}@Overrideprotected List<Person> run() throws Exception {logger.info("Retrieving details for : " + this.ids);return personService.findPeople(this.ids);}
}

到目前为止,这很简单,复杂的逻辑现在在RequestCollapser中,如下所示:

package aggregate.commands.collapsed;import com.netflix.hystrix.HystrixCollapser;
import com.netflix.hystrix.HystrixCollapserKey;
import com.netflix.hystrix.HystrixCollapserProperties;
import com.netflix.hystrix.HystrixCommand;import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;public class PersonRequestCollapser extends HystrixCollapser<List<Person>, Person, Integer> {private final Integer id;public PersonRequestCollapser(Integer id) {super(Setter.withCollapserKey(HystrixCollapserKey.Factory.asKey("personRequestCollapser")).andCollapserPropertiesDefaults(HystrixCollapserProperties.Setter().withTimerDelayInMilliseconds(2000)));this.id = id;}@Overridepublic Integer getRequestArgument() {return this.id;}@Overrideprotected HystrixCommand<List<Person>> createCommand(Collection<CollapsedRequest<Person, Integer>> collapsedRequests) {List<Integer> ids = collapsedRequests.stream().map(cr -> cr.getArgument()).collect(Collectors.toList());return new PersonRequestCommand(ids);}@Overrideprotected void mapResponseToRequests(List<Person> batchResponse, Collection<CollapsedRequest<Person, Integer>> collapsedRequests) {Map<Integer, Person> personMap = batchResponse.stream().collect(Collectors.toMap(Person::getId, Function.identity()));for (CollapsedRequest<Person, Integer> cr: collapsedRequests) {cr.setResponse(personMap.get(cr.getArgument()));}}
}

这里发生了一些事情,首先,参数化类型签名中的类型指示响应的类型(List <Person>),调用者期望的响应类型(Person)和请求的请求类型(请求的ID)。人)。 然后有两种方法,一种是创建批处理命令,第二种是将响应映射回原始请求。

现在,从用户的角度来看,这没有多大变化,就好像对单个命令一样进行调用,并且Request Collapsing处理批处理,分派和映射回响应。 这是示例测试的样子:

@Test
public void testCollapse() throws Exception {HystrixRequestContext requestContext = HystrixRequestContext.initializeContext();logger.info("About to execute Collapsed command");List<Observable<Person>> result = new ArrayList<>();CountDownLatch cl = new CountDownLatch(1);for (int i = 1; i <= 100; i++) {result.add(new PersonRequestCollapser(i).observe());}Observable.merge(result).subscribe(p -> logger.info(p.toString()), t -> logger.error(t.getMessage(), t), () -> cl.countDown());cl.await();logger.info("Completed executing Collapsed Command");requestContext.shutdown();
}

结论

Hystrix的功能远远不止我在此介绍的内容。 它确实是一个很棒的库,对于创建弹性系统至关重要。我已经开始欣赏设计这个出色的库所花费的大量思考过程。

翻译自: https://www.javacodegeeks.com/2015/11/gentle-introduction-to-hystrix-wrapup.html

hystrix熔断 简介

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UDP/TCP 包的大小限制知多少

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删一、MTU 简述 - 分包后数据包最大长度1、定义Maximum Transmission Unit&#xff08;最大可传输单元&#xff09; 的缩写&#xff0c;它的单位是…

autocad2014 菜单栏 闪退_AutoCAD2014闪退的原因与处理办法 1打开就闪退怎样办

软件安装&#xff1a;装机软件必备包关于电脑装机必须的软件&#xff0c;比如windows office系列办公软件、网页浏览器、杀毒软件、安全防护软件、刻录软件、压缩软件、下载工具、多媒体播放软件、多媒体编辑软件、输入法、图片查看和处理软件、聊天沟通工具、系统工具与驱动补…

java ee的小程序_扩展Java EE应用程序的基础

java ee的小程序老实说&#xff0c;“可扩展性”是一个详尽的主题&#xff0c;并且通常没有被很好地理解。 通常&#xff0c;它被认为与高可用性相同。 我已经看到新手程序员和“经验丰富”的建筑师都建议将“ 群集 ”作为可伸缩性和HA的解决方案。 它实际上没有任何问题&#…

28 张图,一次性说清楚 TCP,速度

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删做IT相关的工作&#xff0c;肯定都离不开网络&#xff0c;网络中最重要的协议是TCP。无论是实际工作还是笔试面试&#xff0c;你看哪里能少得了T…

晨风机器人怎么买奴隶_潮牌复刻和正品该怎么抉择???带你了解了解

今天带你们聊一聊潮牌复刻和正品&#xff0c;简单介绍一下我自己&#xff0c;在复刻圈子五年&#xff0c;我的原则从始至终就是质量放在第一位&#xff0c;之所以能走这么久也是这个原因。回归正题&#xff0c;接着往下看。无论是正品还是复刻&#xff0c;其实还要根据自己的能…

php cdi_本机CDI限定词:@Any和@Default

php cdi让我们看一下CDI中的开箱即用的限定词 CDI规范声明了三个限定符– Any&#xff0c; Default&#xff0c; New Any &#xff1a;将其视为无所不在的限定词。 它在那里&#xff0c;即使不是;-) Default &#xff1a;顾名思义&#xff0c;当没有其他限定符时&#xff0…

C语言字符串函数strcat | strcpy | strlen | strcmp的用法及原型

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删strcat(str1,str2) 意为将字符串str2连接到字符串str1之后strcat用法如下#include <stdio.h> #include <string.h>int main () {cha…

crntos7启动php命令_CentOS7设置php-fpm开机自启动

php-fpm安装成功后并不会开机启动&#xff0c;如果是运行正常的程序在系统重启后出现502报错(502 Bad Gateway)&#xff0c;通常就是php-fpm没启动起来。0 先确定几个文件的位置&#xff0c;记录下来备用a php-fpmwhich php-fpm/usr/sbin/php-fpmb conf#几个可能的位置#/etc/ph…

java jpa 异步编程_异步处理时的JPA

java jpa 异步编程几年前&#xff0c;在Java世界中&#xff0c;几乎显而易见的是&#xff0c;每个“企业”类项目都需要JPA与数据库进行通信。 JPA是Joel Spolsky描述的“ 泄漏抽象 ”的完美示例。 刚开始时很棒而又容易&#xff0c;但是最后很难调整和限制。 对于许多参与数据…

C语言字符数组与字符串的使用详解

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删正文1、字符数组的定义与初始化字符数组的初始化&#xff0c;最容易理解的方式就是逐个字符赋给数组中各元素。char str[10]{ I, ,a,m, ,‘h,a,p…

SRC挖洞网集合

阿里SRC https://security.alibaba.com/ 蚂蚁集团SRC https://security.alipay.com/ 阿里本地生活SRC https://asrc.alibaba.com/#/ 京东安全应急响应中心 https://security.jd.com/#/ 腾讯SRC https://security.tencent.com/ 美团安全应急响应中心 https://security.meit…

不能将紧实的字段 绑定到_代码整洁之道【笔记】

一、整洁代码A.混乱的代价1.有些团队在项目初期进展迅速&#xff0c;但有那么一两年的时间却慢去蜗行。对代码的每次修改都影响到其他两三处代码2.花时间保持代码整洁不但有关效率&#xff0c;还有关生存3.程序员遵从不了解混乱风险经理的意愿&#xff0c;也是不专业的做法4.Bj…

存根类 测试代码 java_测试双打:模拟,假人和存根

存根类 测试代码 java大多数班级都有合作者。 在进行单元测试时&#xff0c;您通常希望避免使用那些协作者的实际实现方式来避免测试的脆弱性和绑定/耦合&#xff0c;而应使用测试双打&#xff1a;模拟&#xff0c;存根和双打。 本文引用了有关该主题的两篇现有文章&#xff1…

5 个牛逼的算法设计,你知道几个?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删1、分治法概念&#xff1a;将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的相同问题&#xff0c;以便各个击破&#xff0c;分而治之…

python2.7.10安装教程_Linux系统(CentOS)下python2.7.10安装

本文记录了Linux系统(CentOS)安装Python&#xff0c;供大家参考&#xff0c;具体内容如下Python(Linux) 下载地址操作系统&#xff1a;Centos6.41、下载下载的版本&#xff1a;Python-2.7.10.tgz2、安装一般情况下&#xff0c;Linux都会预装 Python了&#xff0c;但版本较低。(…

javafx窗体程序_JavaFX实际应用程序:AISO HRC-Matic

javafx窗体程序“ Real-World JavaFX Apps”系列中的第三个应用程序是一种重型数据输入应用程序&#xff0c;由称为HRC-Matic的关系数据库支持。 它由AISO在日内瓦开发。 AISO是一家专门开发基于JavaFX的业务应用程序的公司。 他们还在研究我在本系列的第一个博客&#xff08; …

x201换风扇_笔记本怎么换风扇 ThinkPad X201i换风扇图文教程

ThinkPad X201i换电扇图文教程&#xff1a;拆机之前&#xff0c;我们需求先对X201i的散热电扇在停止了开端的理解&#xff0c;得知价钱从10元左右的单电扇&#xff0c;到上百的散热全体都有&#xff0c;而且还分东芝产和松下产等不同产地的&#xff0c;小编选择了松下产的整套散…

几十个Shell分析日志文件脚本!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删收集&#xff0c;整理一些服务器日志分析命令&#xff0c;可以用来分析自己网站服务器日志&#xff0c; 看看网站的访问量。看看有没有黑阔搞破坏…

flex布局水平垂直 垂直_垂直和水平装饰

flex布局水平垂直 垂直装饰器模式是在不更改其接口的情况下向对象添加功能的最佳方法之一。 我经常使用可组合装饰器&#xff0c;并且总是会问自己在功能列表必须可配置时如何正确设计它们。 我不确定我的答案是否正确&#xff0c;但是这里有一些值得深思的地方。 The Apartme…

一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删栈是什么&#xff1f;栈有什么作用&#xff1f;首先&#xff0c;栈 (stack) 是一种串列形式的数据结构。这种数据结构的特点是后入先出 (LIFO, L…