计算机系统应用教程网站

网站首页 > 技术文章 正文

高可用架构-容错机制 容错技术可以提高系统的可靠性

btikc 2024-10-29 13:18:50 技术文章 6 ℃ 0 评论

Hystrix是Netfilx公司的,其设计思想值得学习。


Hystrix设计原则

对依赖服务调用时出现的调用延迟和调用失败进行控制和容错保护;

在复杂的分布式系统中,阻止某个依赖服务的故障在整个系统中蔓延;

提供fail-fast和快速恢复的支持;

提供fallback优雅降级支持。

使用资源隔离技术,如bulkhead(舱壁隔离技术)、swimlane(泳道技术)、circuit breaker(断路技术)来限制任何一个依赖服务故障的影响。

近实时的统计、监控、报警功能,来提高故障发现的速度;


基于Hystrix线程池技术实现资源隔离


基于Hystrix信号量机制实现资源隔离

信号量的资源隔离只是一个开关的作用。如服务A的信号量大小为10,那么就是说他同时只允许10个线程来访问服务A,多余的请求就被拒绝。


Resilience4j(Spring官方推荐)

一个轻量级、易使用的容错库。灵感来自于Hystrix。

提供4种容错机制舱壁、断路器、限速器、重试


舱壁(Bulkhead)

提供2种模式:

SemaphoreBulkhead(信号量舱壁,默认),基于Java并发库Semaphore实现;

FixedThreadPoolBulkhead(固定线程池舱壁),使用一个有界队列和一个固定线程池;


信号量舱壁(SemaphoreBulkhead)

当信号量存在剩余时进入系统的请求会直接获取信号量并开始业务处理。当信号量全被占用时,新来的请求将会进入阻塞状态,SemaphoreBulkhead提供一个阻塞计数器,如果被阻塞的请求在阻塞计时器内无法获得信号量则系统会拒绝这些请求。如果在阻塞计时内拿到信号量,那么此请求就会执行业务处理。


固定线程池舱壁(FixedThreadPoolBulkhead)

使用一个固定线程池和一个等待队列实现舱壁。当线程池中存在空闲时,客户端请求会直接进入线程池开启新线程或使用空闲线程来处理请求。若线程池无空闲线程请求将会进入等待队列,如果等待队列仍然无剩余空间那么请求将会被拒绝。在等待队列中的的请求当线程池出现空闲时,会进入线程池进行业务处理。


限速器(RateLimiter)

限速器防止突然过量的请求导致系统崩溃。限速器使用一个刷新周期的概念,限定在一个固定刷新周期内可以处理最大的请求数量。如果某个刷新周期内的请求量已达到最大,则这个周期内的请求进入阻塞状态。如果在最大阻塞计时内新的刷新周期开启,则阻塞状态的请求将进入新的周期内进行处理。若未开启,则阻塞计时超时的请求会被拒绝。


断路器(CircuitBreaker)

断路器存在三种状态:CLOSE、OPEN、HALF_OPEN,且通过一个时间或数量窗口来记录当前的请求成功率或慢速率,从而根据这些指标来做出正确的容错响应。

当处于CLOSE状态,请求进入系统时,断路器会计算出当前请求的前一个窗口里所有请求的异常率,若异常率低于预期配置的值,则会正常执行这个请求。

当异常率高于预期配置值时,会进入OPEN状态,并会暂时性拒绝所有请求。

在一段冷却时间后,断路器进入HALF_OPEN状态,在此状态下会尝试接受一定数量的请求,若一定数量的请求异常率低于预期值,断路器会恢复到CLOSE状态,正常处理请求。如果异常率还是高于预期值则会退回到OPEN状态。


重试(Retry)

当服务端处理客户请求异常时,服务器会开启重试机制,重试期间内,服务器将每隔一锻时间重试业务处理。

若最大重试次数内成功处理业务,则停止重试。

如若最大重试次数内业务处理依然异常,则会拒绝该请求。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表