惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

I
InfoQ
C
CERT Recently Published Vulnerability Notes
The Last Watchdog
The Last Watchdog
P
Proofpoint News Feed
D
Darknet – Hacking Tools, Hacker News & Cyber Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
GbyAI
GbyAI
T
Tenable Blog
博客园 - 三生石上(FineUI控件)
P
Privacy & Cybersecurity Law Blog
Simon Willison's Weblog
Simon Willison's Weblog
Jina AI
Jina AI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tor Project blog
博客园_首页
F
Fortinet All Blogs
博客园 - Franky
Latest news
Latest news
Last Week in AI
Last Week in AI
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
U
Unit 42
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hugging Face - Blog
Hugging Face - Blog
D
Docker
Project Zero
Project Zero
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MongoDB | Blog
MongoDB | Blog
F
Full Disclosure
D
DataBreaches.Net
Google DeepMind News
Google DeepMind News
Cisco Talos Blog
Cisco Talos Blog
Y
Y Combinator Blog
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
H
Help Net Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Blog — PlanetScale
Blog — PlanetScale
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Schneier on Security
C
Cybersecurity and Infrastructure Security Agency CISA
P
Proofpoint News Feed
PCI Perspectives
PCI Perspectives
Cloudbric
Cloudbric
V
Visual Studio Blog
Recorded Future
Recorded Future
人人都是产品经理
人人都是产品经理

犀利豆的博客

《SRE google 运维解密》读书笔记 (六) 《SRE google 运维解密》读书笔记 (五) 《SRE google 运维解密》读书笔记 (四) 《SRE google 运维解密》读书笔记 (三) 《SRE google 运维解密》读书笔记 (二) 《SRE google 运维解密》读书笔记 (一) 2021 总结 终于有一个 Java 可以用的微信机器人了 Vertx入门到实战—实现钉钉机器人内网穿透代理 钉钉机器人回调内网穿透代理--使用篇 周末补习(一)trie 树 那些有趣的代码(三)--勤俭持家的 ArrayList 那些有趣的代码(二)--偏不听父母话的 Tomcat 类加载器 那些有趣的代码(一)--有点萌的 Tomcat 的线程池 从需求第三定律说起--为什么知乎的回答质量下降了 如何利用 Spring Hibernate 高级特性设计实现一个权限系统 居然有人能忘记吃饭?写个微信机器人提醒他 我的2018年总结 从 LongAdder 中窥见并发组件的设计思路 徒手撸框架--实现 RPC 远程调用 我的写作工具链 Java 渲染 docx 文件,并生成 pdf 加水印 撸码的福音--变量名生成器的实现 Raft 协议学习笔记 dubbo 源码学习(一)开篇 Redis 命令的执行过程 Redis 中的事件驱动模型 Redis 数据库、键过期的实现 Redis 的基础数据结构(三)对象 Redis 的基础数据结构(二) 整数集合、跳跃表、压缩列表 Redis 的基础数据结构(一) 可变字符串、链表、字典 线程池 execute() 的工作逻辑 JAVA 中的 CAS 徒手撸框架--高并发环境下的请求合并 徒手撸框架--实现Aop 徒手撸框架--实现IoC 2017个人总结 最近遇到的几个问题集合 Redis RedLock 完美的分布式锁么? JAVA 8入门(二)流 JAVA 8入门(一)Lambda表达式 有道 Alfred Workflow 威力加强版 Kafka实现原理笔记 《交易系统:更新与跨越》读后笔记 Netty-Apns接入实现 Future研究 Redis实现分布式锁
Hystrix入门研究
Zhengxin Diao · 2017-10-24 · via 犀利豆的博客

Hystrix 是Netflix开源的一个针对分布式容错和库。Hystrix的主要功能是隔离分布式系统之间的故障,防止故障带来的雪崩效应。同时也能提供一个分布式服务的优雅的降级方案。从而提高系统的可用性的组件。

2、Hystrix设计理念是什么(其实也是高可用系统设计的理念)

  1. 防止单个系统故障后,造成容器(tomcat,scf)的线程全部占满,影响服务响应。
  2. 使用快速失败和泄洪代替队列等待。
  3. 在系统故障之后提供优雅的降级措施。
  4. 使用隔离技术降低故障影响面。
  5. 提供准实时的监控报警系统。
  6. 提供准实时动态的配置系统。å
  7. 客户端感知下游服务状态,防止错误的发展,而不通过真实的调用就能感知。

3、Hystrix怎么用

  • Hello World:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class CommandHelloWorld extends HystrixCommand<String>{

private final String name;

public CommandHelloWorld(String name){
super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
this.name = name;
}

protected String run() throws Exception {
return "Hello " + name;
}

public static void main(String[] args) throws ExecutionException, InterruptedException {
String s = new CommandHelloWorld("BoB").execute();

System.out.println(s);

}
}
  • 降级:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class CommandHelloFailure extends HystrixCommand<String> {

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 + "!";
}
}

4、Hystrix实现思路分析

1、数据流

数据流

  1. 初始化 HystrixCommand 或者 HystrixObservableCommand 对象。
  2. 执行。
  3. 判断是否有缓存?
  4. 判断是否调用链路是否通畅?
  5. 判断线程池/队列/信号量 是否满了?
  6. 执行HystrixObservableCommand.construct() 或者HystrixCommand.run()方法
  7. 计算调用下游的健康程度
  8. 判断时候需要降级
  9. 完成请求

2、熔断器

IMG
每个熔断器维护10个buckets窗口,每秒生成一个新的bucket,把最早的bucket抛弃,每个bucket记录了调用的,成功、失败、超时、拒绝的次数,如果失败数量达到某个阈值,就会触发熔断。

3、隔离

线程隔离

每个下游调用使用独立的线程池,而非与请求的调用共用一个线程池,这样可以防止失败的调用占用共用的线程池,造成整个系统拒绝服务。

优缺点

优点:
相互独立,减少互相影响的风险,总的来说就是隔离解耦,不会互相影响》
缺点:
过多的线程池造成cpu计算能力的消耗,和增加代码的复杂度。

信号量隔离

信号隔离也可以用于限制并发访问,防止阻塞扩散, 与线程隔离最大不同在于执行依赖代码的线程依然是请求线程(该线程需要通过信号申请),
如果客户端是可信的且可以快速返回,可以使用信号隔离替换线程隔离,降低开销.

4、请求折叠

可以使用组件HystrixCollapser把前端的多个请求折叠为单一的一个后端请求。减少线程和链接的开销。

5、请求缓存

把请求缓存起来。这个不过多解释了