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

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

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

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

要求折叠

Tomaz Nurkiewicz在他的博客网站NoBlogDefFound中做了出色的解释请求折叠的工作 。 我的示例有些简化,请考虑以下情况,其中有很多请求要检索给定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

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

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

相关文章

git常用命令有用

http://www.cnblogs.com/cspku/articles/Git_cmds.html转载于:https://www.cnblogs.com/yanjunhelloworld/p/5507706.html

现在抖音这么火,那么你知道如何用CSS实现抖音字体?

比如这种抖音字体是不是感觉很酷,它是如何实现的呢,下面孙叫兽就简单分享一下CSS的实现方法,记得点赞收藏。 老司机给大家的一些小建议,一定要敲代码敲代码敲代码(重要的事情说三遍),程序员是实战家,不是思想家和理论家,程序员都是工兵,这个排雷的经验很重要。 实现这…

史上最全关于苹果开发者账号及上架APPStore总结

很多人如果开发这种移动应用APP,上架到到APPStore难免会遇到一系列的问题,这里孙叫兽进行总结一下,如果本文对你有帮助,记得转发点赞收藏。 一: 开发者账号的介绍 1 个人开发者账号 申请费用: 99美元/年 介绍:一般由iOS开发者个人申请,上架开发者自己的APP作品到苹果商…

EK算法应用,构图(POJ1149)

题目链接&#xff1a;http://poj.org/problem?id1149 题意中有一点要注意&#xff0c;否则构图就会有问题&#xff0c;每个顾客走后&#xff0c;被打开过的那些猪圈中的猪都可以被任意的调换到其他开着的猪圈中。 这里的构图不是单一的相邻&#xff0c;以及容量了&#xff0c;…

平台代码检查工具:sonarLint+sonarqube安装教程

加强对代码质量的管控要求&#xff0c;不允许新增代码部分出现严重、重要、主要等sonar扫描问题。 大家按以下文档安装开发工具对应的代码检测插件&#xff0c;请大家务必重视、执行.这里只介绍前端开发VSCode,后端开发Eclipse,两种代表性的编译器安装sonarLintsonarqube方法,其…

jboss as安装配置_书评:JBoss AS 7:配置,部署和管理

jboss as安装配置我热切地接受Packt Publishing邀请复审JBoss AS 7&#xff1a;配置&#xff0c;部署和管理&#xff0c;因为自从我上次使用JBoss已有数年了&#xff0c;我很想了解有关JBoss AS 7的更多信息。 我已经写过关于《 JBoss AS 7配置&#xff0c;部署和管理》一书的第…

程序员通过CSDN如何获取收益

大家好,我是孙叫兽 ,本期内容给大家分享如何使用CSDN一边学习,一遍赚取收益,这样学习的时候也会产生动力. 废话不多说,直接看近7天收益. 博主如何赚取收益 对于博主这些创作者来说,收益主要有付费专栏,VIP文章收益,活动收益,红包收益,问答收益,打赏收益,付费资源收益,下载VIP分…

在Java8中包装设计模式

环绕模式未在GOF书中列出&#xff0c;但对于以下问题非常有用&#xff1a; 循环构造&#xff0c;例如执行while / while / for循环 秒表周围的一些代码。 用运行时异常包装检查的异常 初始化和清理&#xff0c;例如创建/销毁线程池或打开/关闭文件等 将上下文信息添加到线…

《Windows驱动开发技术详解》之编程加载NT式驱动

之前我们加载驱动都是利用INSTDRV这个应用&#xff0c;其原理是在注册表中写入相应的字段&#xff0c;这一节我们手动编写代码去加载驱动&#xff0c;其原理类似&#xff1a; 设备驱动程序的动态加载主要由服务控制管理程序&#xff08;Service Control Manager,SCM&#xff09…

教你如何成为解决问题的高手

最近看到很多初级或者准备入坑的小伙伴在问答模块提问问题 ,有的在QQ群或者微信群提问题,这个是很多新手程序员都会经历的一个过程,这种事情很正常,主要是自己都不清楚问题是什么或者描述不清楚,别人如何帮你解答呢? 目录 1.澄清问题 2.关联经验 3.问题重现 4.寻找差异 5…

mongodb存储数据_在MongoDB中存储分层数据

mongodb存储数据继续使用MongoDB进行 NoSQL之旅&#xff0c;我想谈一谈一个经常出现的特定用例&#xff1a;存储分层文档关系。 MongoDB是很棒的文档数据存储&#xff0c;但是如果文档具有父子关系&#xff0c;该怎么办&#xff1f; 我们可以有效地存储和查询此类文档层次结构吗…

程序员如何快速成长为IT精英

很多程序员工作了很多年,仍然只学到了皮毛点的业务和技术,技术长时间没有提升,一直拖拖拉拉处于某个水平,没有接触到核心业务,也难于成为公司的中流砥柱和骨干。那么程序员该如何成长呢? 1.主动学习 时刻保持危机感,对知识保持好奇心,完善自己的职业规划和知识体系,掌…

hdu1521 指数型母函数

排列组合 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3438 Accepted Submission(s): 1439Problem Description有n种物品&#xff0c;并且知道每种物品的数量。要求从中选出m件物品的排列数。例如有两种物品…

【Java从入门到天黑|06】高质量男性SpringBoot入门及原理(基础总结版,强烈建议收藏)

目录 SpringBoot简介 Spring是为了解决企业级应用开发的复杂性而创建的,简化开发。 helloWorld

JavaFX实际应用程序:AISO HRC-Matic

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

Feather包实现数据框快速读写,你值得拥有

什么是Feather&#xff1f; Feature是一种文件格式&#xff0c;支持R语言和Python的交互式存储&#xff0c;速度更快。目前支持R语言的data.frame和Python pandas 的DataFrame。 Feather收到了Apache arrow 项目的支持&#xff0c;Apache Arrow是Apache基金会下一个全新的开源项…

一文教你学会需求分析与管理

大家好,我是孙叫兽,本期给大家分享需求分析与管理,在项目开始或者需求整理时,这方面的知识显得尤为重要,常言道:良好的开始是成功的一半! 1.需求的定义 产品需求是在一定的时期,一定的场景中,无论是心理上还是生理上的,用户有着某种“需要”,这种“需要”用户自己不…

java 编写代码_Java 7:如何编写非常快速的Java代码

java 编写代码当我第一次写此博客时&#xff0c;我的目的是向您介绍ThreadLocalRandom类&#xff0c;它是Java 7中新增的用于生成随机数的类。 我在一系列微基准测试中分析了ThreadLocalRandom的性能&#xff0c;以了解其在单线程环境中的性能。 结果相对令人惊讶&#xff1a;尽…

POJ 1172 DFS

&#xff08;感谢wzc学长的幻灯片&#xff09; 单组数据 注意从必经点能到标记过的点则此点不是分裂点。 //By: Sirius_Ren #include <cstdio> #include <queue> #include <cstring> using namespace std; int tot1,first[51],cnt,v[101],nxt[101],n,vis[51…