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

推荐订阅源

T
Tailwind CSS Blog
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
L
LangChain Blog
博客园_首页
Recent Announcements
Recent Announcements
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
H
Hackread – Cybersecurity News, Data Breaches, AI and More
爱范儿
爱范儿
博客园 - 叶小钗
博客园 - 【当耐特】
The Cloudflare Blog
J
Java Code Geeks
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏
A
About on SuperTechFans

博客园 - 何锦彬

没开电脑! 只用手机和QQ聊天, 让openClaw帮我"手搓"个AI新闻网站 AI编程从 “猜你想要” 到 “精准生成”, 基于Qoder的Spec驱动开发初探. Java团队Cursor最佳实践:3分钟构建「零泄漏」AI开发环境 再不用手写Commit!AI自动总结代码变更,Git提交效率 MCP赋能,给Cursor插上“外挂翅膀”:实战操作数据库 一个老程序员, 两个小时能用corsur做出什么样的东西 会用 AI 的工程师,效率已经拉开差距了 - “ 我们曾经引以为傲的编码能力,正在被改写。” 1-2 【包子mysql系列】, 对mysql的innoDB加锁分析 1-1, 一个简单的mysql 安装教程,基于mysql 5.7解压版本. 为什么阿里的dubbo注册中心要放弃zookeeper, 而用Nacos? 和spring cloud/boot 学习如何管理自己的组件 利用jmeter+JAVA对RPC的单接口(dubbo接口等)进行性能测试 spring mvc中,直接注入的HttpServletRequst是否安全呢? 基础篇系列,JAVA的并发包 - 锁 撸基础篇系列,JAVA的NIO部分 1, 本地缓存的实现以及遇到的问题 JAVA的那些数据结构实现总结,实现,扩容说明 JAVA中的数据结构 - 真正的去理解红黑树 对把JDK源码的一些注解,笔记
Hystrix 服务的隔离策略对比,信号量与线程池隔离的差异
何锦彬 · 2018-09-21 · via 博客园 - 何锦彬

支持的隔离策略

Hystrix支持的 hytrix支持线程池隔离和信号量隔离

信号量的隔离:

  •  it executes on the calling thread and concurrent requests are limited by the semaphore count

 - 引自官网

自我理解:

每次调用线程,当前请求通过计数信号量进行限制,当信号大于了最大请求数(maxConcurrentRequests)时,进行限制,调用fallback接口快速返回。

07122136uv5i.png

最重要的是,信号量的调用是同步的,也就是说,每次调用都得阻塞调用方的线程,直到结果返回。这样就导致了无法对访问做超时(只能依靠调用协议超时,无法主动释放)

官网对信号量隔离的描述建议

  • Generally the only time you should use semaphore isolation for HystrixCommands is when the call is so high volume (hundreds per second, per instance) that the overhead of separate threads is too high; this typically only applies to non-network calls.

 理解下两点:

  1. 隔离的细粒度太高,数百个实例需要隔离,此时用线程池做隔离开销过大
  2. 通常这种都是非网络调用的情况下

线程池隔离:

  • it executes on a separate thread and concurrent requests are limited by the number of threads in the thread-pool

通过每次都开启一个单独线程运行。它的隔离是通过线程池,即每个隔离粒度都是个线程池,互相不干扰

  • Commands executed in threads have an extra layer of protection against latencies beyond what network timeouts can offer.

线程池隔离方式,等于多了一层的保护措施,可以通过hytrix直接设置超时,超时后直接返回。

07122201jfas.png

最后总结对比下:

最后总结对比下:

隔离方式 是否支持超时 是否支持熔断 隔离原理 是否是异步调用 资源消耗
线程池隔离 支持,可直接返回 支持,当线程池到达maxSize后,再请求会触发fallback接口进行熔断 每个服务单独用线程池 可以是异步,也可以是同步。看调用的方法 大,大量线程的上下文切换,容易造成机器负载高
信号量隔离 不支持,如果阻塞,只能通过调用协议(如:socket超时才能返回) 支持,当信号量达到maxConcurrentRequests后。再请求会触发fallback 通过信号量的计数器 同步调用,不支持异步 小,只是个计数器

附上:

以前对zuul网关的一个误解,以为网关用的是线程池隔离是属于异步调用的,其实查看源码如下:

调用的是hytrix command的excute方法,hytrix的官网原文说明如下:

  • execute() — blocks, then returns the single response received from the dependency (or throws an exception in case of an error)

execute是一个阻塞方法,也就是说,如果不合理的设置线程池的大小,和超时时间,还是有可能把zuul的线程消耗完。从而失去对服务的保护作用