Java의 다운그레이드된 구성요소인 Hystrix의 기능은 무엇입니까?
1. 면접관: Hystrix의 기능을 간단히 소개해주실 수 있나요?
문제 분석: Hystrix의 기능을 이해하는 동시에 Hystrix의 우수한 디자인 컨셉에서 건축 디자인 영감을 얻으세요.
답변: Hystrix의 보호 하에 시스템을 오랫동안 고가용성 상태로 유지할 수 있습니다. 일반적으로 사용되는 기능은 다음과 같습니다.
1.1, fast failure. )
Hystrix는 빠른 실패(빠른 실패) 및 빠른 복구 메커니즘을 제공하도록 설계되었습니다.
팁: 이전에 빠른 실패 메커니즘을 이해했는지 모르겠지만 Java 기본에 대해 인터뷰할 때 HashMap의 Iterator는 빠른 실패, **빠른 실패(fail—fast)로 설계되었습니다. ** Java 컬렉션의 메커니즘입니다. 컬렉션 개체를 순회하기 위해 반복자를 사용할 때 순회 프로세스 중에 컬렉션 개체의 내용이 수정(추가, 삭제, 수정)되면 동시 수정 예외가 발생합니다.
처음 HashMap을 배웠을 때, 빠른 실패는 Java 비-스레드 안전 컬렉션의 동시 작업을 방지하기 위해 Java 컬렉션 클래스에만 적용되는 줄 알았습니다. 시스템 아키텍처 설계에서는 시간 내에 처리할 수 없는 요청은 대기하는 대신 시스템 부하를 줄이기 위해 빠르게 실패(fail-fast)합니다.
1.2. Fallback 우아한 저하 메커니즘
Fallback은 말 그대로 Fallback을 만났을 때 다시 시작한다는 의미입니다. Fallback의 메커니즘을 배운 후 즉시 프로젝트에 사용했습니다.
실제 예를 살펴보세요:
@Override @Degrade(key = "getOrderByParamFromES", fallBackMethod = "getOrderByParamFromMysql") public OrderResult getOrderByParamFromES(OrderSearchParam param) { //走ES查询 ...... return OrderResult; } //fallBack后调用getOrderByParamFromMysql方法 public OrderResult getOrderByParamFromMysql(OrderSearchParam param) { //走mysql查询 ...... return OrderResult; }
코드 설명:
fallBackMethod = "getOrderByParamFromMysql"
즉, ES 쿼리가 실패한 후 시스템은 자동으로 getOrderByParamFromMysql 메서드를 다운그레이드하고 정상적인 상황에서 mysql 쿼리를 사용합니다. , getOrderByParamFromMysql은 Fall이 아닌 이상 호출되지 않습니다.
1.3. 스레드/세마포어 격리 메커니즘
스레드 격리:
요청은 자체 키에 따라 해당 스레드 풀에서 스레드 실행을 획득하고 스레드 풀 매개변수를 동적으로 설정하여 자연스럽게 다른 요청을 격리합니다. 인터페이스 성능을 향상시키기 위해 비동기식으로 지원합니다. 예를 들어, 다른 요청은 직접적인 영향을 미치지 않습니다. 예를 들어, service1 요청은 느리지만 service2 및 service3은 여전히 정상적으로 작동할 수 있습니다. 단점은 스레드 전환이 성능에 영향을 미친다는 것입니다.
세마포 격리:
Service1, service2, service3은 하나의 요청으로 액세스됩니다. service1 요청 시간이 초과되면 전체 세마포가 해제되지 않으며 다른 요청도 허용되지 않습니다.
대기 시간이 짧은 요청(예: 캐시에 대한 액세스 또는 데이터베이스에 대한 로컬 액세스)의 경우 스레드 풀로 인한 오버헤드가 매우 높습니다. 비차단 세마포어(시간 제한을 지원하지 않음)와 같은 다른 방법을 사용하는 것을 고려할 수 있습니다. ) 서비스의 종속성 격리를 구현합니다. 그러나 대부분의 경우 Netflix는 스레드 풀을 사용하여 종속 서비스를 격리하는 것을 선호합니다. 그 이유는 추가 오버헤드가 허용 가능하고 시간 초과를 포함한 모든 기능을 지원할 수 있기 때문입니다.
2. 인터뷰어: 방금 스레드 격리에 대해 언급했는데, 실제 사용시에는 타임아웃 스레드 중단 스위치를 켜두시나요?
문제 분석: 실제 사용 경험을 바탕으로 스레드 자체의 특성에 따라 스레드가 타임아웃되고, 시간 내에 중단되지 않으면 스레드 리소스가 낭비됩니다.
답변: 일반적인 상황에서는 스레드 리소스를 제때 해제하기 위해 시간 초과 인터럽트 스위치를 켭니다.
hystrix.command.default.execution.isolation.thread.interruptOnTimeout = true로 설정됩니다.
그러나 데이터베이스 명령을 작성하거나 키 로그 명령을 기록하는 경우 명령 실행을 완료하려면 시간 초과 인터럽트를 꺼야 합니다.
(면접관님은 제가 Hystrix 유지보수 경험이 있다고 믿으며 만족스럽게 고개를 끄덕였습니다.)
3. 면접관: 스레드 풀 크기를 어떻게 추정하셨나요?
답변: 스레드 풀의 크기를 올바르게 설정하려면 배포된 시스템의 CPU 수, 메모리 크기 및 작업 유형(컴퓨팅 집약적, IO 집약적 등)을 분석해야 합니다. 작업의 경우 스레드 풀 크기는 CPU 수와 유사합니다. 일반적으로 IO 집약적 작업의 경우 최적의 스레드 풀 크기 계산 공식은 스레드 풀 크기 = CPU 수 * ( 1 + 작업 대기 시간 / 작업 처리 시간).
심층 분석
Hystrix 역사
Hystrix는 2011년 Netflix API 팀이 시작한 프로젝트에서 시작되었습니다. 2012년에도 Hystrix는 지속적으로 발전하고 성숙해졌으며 Netflix 내의 많은 팀이 이를 채택했습니다. 오늘날 Netflix에서는 Hystrix를 통해 매일 수백억 개의 스레드 격리 호출과 수천억 개의 세마포어 격리 호출이 수행됩니다. 이를 통해 가동 시간과 탄력성이 크게 향상됩니다.
동시 액세스가 높은 경우 시스템이 의존하는 서비스의 안정성은 시스템에 큰 영향을 미칩니다. 느린 네트워크 연결, 갑자기 사용되는 리소스, 일시적인 사용 불가능, 서비스 오프라인 등 제어할 수 없는 여러 요인으로 인해 종속성이 발생합니다. 안정적이고 신뢰할 수 있는 분산 시스템을 구축하려면 이러한 내결함성 방법이 있어야 합니다.
Hystrix的主要功能特性
熔断器机制:熔断器可以理解成保险丝,项目里使用Hystrix Command,当 Hystrix Command请求后,如果服务失败数量超过一定比例(比如默认50%),断路器自动熔断,该服务将进入熔断状态,后续请求都会进入fallback。
降级机制:通过fallbackMethod注解,当请求后端服务出现异常的时候, 为了避免影响到其他业务逻辑,可以使用fallback方法指定的方法快速返回,或启用“备胎方案”。
环境隔离:包括线程隔离和信号量隔离。
cache:Hystrix支持将一个请求结果缓存起来,下一个具有相同key的请求将直接从缓存中取出结果,减少请求开销。
Hystrix Demo
通过一个demo快速理解Hystrix fallback 的使用
@Service public class OrderQueryService { /** * 订单查询接口 */ @HystrixCommand(fallbackMethod = "queryOrderBack") public List<Order> queryOrderFromRedis(String userId) { // todo reids查询逻辑 return orderlist; } /** * 订单查询接口失败降级方案 */ @SuppressWarnings("unused") private String queryOrderBack(String userId) { // todo 如,走ES查询逻辑 或者 直接提示用户“请稍后再试” // todo 通知维护人员处理故障 return ""; } }
代码解释:
程序正常时,查询订单服务是走queryOrderFromRedis方法的逻辑,当queryOrderFromRedis方法抛出异常,根据设定的异常比例,或者指定哪个异常,达到阈值触法fallback开关,程序切换到queryOrderBack,设置程序走ES查询逻辑 或者 直接提示用户“请稍后再试”,根据业务自行设置。
哪些情况下会触发fallback?
Failure Type | Exception class | Exception.cause | 触发fallback |
---|---|---|---|
FAILURE | HystrixRuntimeException | underlying exception (user-controlled) | YES |
SEMAPHORE_REJECTED | HystrixRuntimeException | j.l.RuntimeException | YES |
SHORT_CIRCUITED | HystrixRuntimeException | j.l.RuntimeException | YES |
THREAD_POOL_REJECTED | HystrixRuntimeException | j.u.c.RejectedExecutionException | YES |
TIMEOUT | HystrixRuntimeException | j.u.c.TimeoutException | YES |
FAILURE
:任意RuntimeException异常都可以激活fallback。
THREAD_POOL_REJECTED
:并发执行的任务数超过线程池和队列之和时,也就是Hystrix的线程隔离机制。
SEMAPHORE_REJECTED
:类似 THREAD_POOL_REJECTED ,当服务的并发数大于信号量阈值时将进入fallback。比如配置程序执行并发数不能大于3,由于信号量隔离下无论调用哪种命令执行方法,Hystrix都不会创建新线程执行run()/construct()
,所以调用程序需要自己创建多个线程来模拟并发调用execute()
,最后看到一旦并发线程>3,后续请求都进入fallback。
SHORT_CIRCUITED
:在一定时间内,用户请求超过一定的比例失败时,如超时,异常,线程并发达到限定最大值等,断路器都会打开;短路器打开后所有请求直接走fallback,可以通过。circuitBreakerErrorThresholdPercentage方法设置百分比,默认是50。
TIMEOUT
:即超时请求。
附录:Hystrix策略配置
/* --------------统计相关------------------*/ // 统计滚动的时间窗口,默认:5000毫秒(取自circuitBreakerSleepWindowInMilliseconds) private final HystrixProperty metricsRollingStatisticalWindowInMilliseconds; // 统计窗口的Buckets的数量,默认:10个,每秒一个Buckets统计 private final HystrixProperty metricsRollingStatisticalWindowBuckets; // number of buckets in the statisticalWindow // 是否开启监控统计功能,默认:true private final HystrixProperty metricsRollingPercentileEnabled; /* --------------熔断器相关------------------*/ // 熔断器在整个统计时间内是否开启的阀值,默认20。也就是在metricsRollingStatisticalWindowInMilliseconds(默认10s)内至少请求20次,熔断器才发挥起作用 private final HystrixProperty circuitBreakerRequestVolumeThreshold; // 熔断时间窗口,默认:5秒.熔断器中断请求5秒后会进入半打开状态,放下一个请求进来重试,如果该请求成功就关闭熔断器,否则继续等待一个熔断时间窗口 private final HystrixProperty circuitBreakerSleepWindowInMilliseconds; //是否启用熔断器,默认true. 启动 private final HystrixProperty circuitBreakerEnabled; //默认:50%。当出错率超过50%后熔断器启动 private final HystrixProperty circuitBreakerErrorThresholdPercentage; //是否强制开启熔断器阻断所有请求,默认:false,不开启。置为true时,所有请求都将被拒绝,直接到fallback private final HystrixProperty circuitBreakerForceOpen; //是否允许熔断器忽略错误,默认false, 不开启 private final HystrixProperty circuitBreakerForceClosed; /* --------------信号量相关------------------*/ //使用信号量隔离时,命令调用最大的并发数,默认:10 private final HystrixProperty executionIsolationSemaphoreMaxConcurrentRequests; //使用信号量隔离时,命令fallback(降级)调用最大的并发数,默认:10 private final HystrixProperty fallbackIsolationSemaphoreMaxConcurrentRequests; /* --------------其他------------------*/ //使用命令调用隔离方式,默认:采用线程隔离,ExecutionIsolationStrategy.THREAD private final HystrixProperty executionIsolationStrategy; //使用线程隔离时,调用超时时间,默认:1秒 private final HystrixProperty executionIsolationThreadTimeoutInMilliseconds; //线程池的key,用于决定命令在哪个线程池执行 private final HystrixProperty executionIsolationThreadPoolKeyOverride; //是否开启fallback降级策略 默认:true private final HystrixProperty fallbackEnabled; // 使用线程隔离时,是否对命令执行超时的线程调用中断(Thread.interrupt())操作.默认:true private final HystrixProperty executionIsolationThreadInterruptOnTimeout; // 是否开启请求日志,默认:true private final HystrixProperty requestLogEnabled; //是否开启请求缓存,默认:true private final HystrixProperty requestCacheEnabled; // Whether request caching is enabled //请求合并是允许的最大请求数,默认: Integer.MAX_VALUE private final HystrixProperty maxRequestsInBatch; //批处理过程中每个命令延迟的时间,默认:10毫秒 private final HystrixProperty timerDelayInMilliseconds; //批处理过程中是否开启请求缓存,默认:开启 private final HystrixProperty requestCacheEnabled; /* 配置线程池大小,默认值10个 */ private final HystrixProperty corePoolSize; /* 配置线程值等待队列长度,默认值:-1 建议值:-1表示不等待直接拒绝,测试表明线程池使用直接决绝策略+ 合适大小的非回缩线程池效率最高.所以不建议修改此值。 当使用非回缩线程池时,queueSizeRejectionThreshold,keepAliveTimeMinutes 参数无效 */ private final HystrixProperty maxQueueSize;
其他常用限流降级组件
Sentinel
:阿里巴巴集团内部基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。2018 年,Sentinel 开源,并持续演进。
Resilience4j
:也是一个轻量级的容错组件,其灵感来自于 Hystrix,但主要为 Java 8 和函数式编程所设计。轻量级体现在其只用 Vavr库(前身是 Javaslang),没有任何外部依赖。而 Hystrix 依赖了 Archaius ,Archaius 本身又依赖很多第三方包,例如 Guava、Apache Commons Configuration 等。
Sentinel 与 Hystrix resilience4j 对比
Sentinel | Hystrix | resilience4j | |
---|---|---|---|
隔离策略 | 信号量隔离(并发线程数限流) | 线程池隔离/信号量隔离 | 信号量隔离 |
熔断降级策略 | 基于响应时间、异常比率、异常数等 | 异常比率模式、超时熔断 | 基于异常比率、响应时间 |
实时统计实现 | 滑动窗口(LeapArray) | 滑动窗口(基于 RxJava) | Ring Bit Buffer |
动态规则配置 | 支持多种配置源 | 支持多种数据源 | 有限支持 |
扩展性 | 丰富的 SPI 扩展接口 | 插件的形式 | 接口的形式 |
基于注解的支持 | 支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持 | Rate Limiter |
集群流量控制 | 支持 | 不支持 | 不支持 |
流量整形 | 支持预热模式、匀速排队模式等多种复杂场景 | 不支持 | 简单的 Rate Limiter 模式 |
系统自适应保护 | 支持 | 不支持 | 不支持 |
控制台 | 提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等 | 简单的监控查看 | 不提供控制台,可对接其它监控系统 |
多语言支持 | Java / C++ | Java | Java |
开源社区状态 | 活跃 | 停止维护 | 较活跃 |
위 내용은 Java의 다운그레이드된 구성요소인 Hystrix의 기능은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 난수 생성기 안내. 여기서는 예제를 통해 Java의 함수와 예제를 통해 두 가지 다른 생성기에 대해 설명합니다.

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4
