博客
关于我
使用Hystrix提高系统可用性
阅读量:450 次
发布时间:2019-03-06

本文共 1909 字,大约阅读时间需要 6 分钟。

在分布式系统中,依赖关系的复杂性和服务的不可靠性是系统设计中的一个重大挑战。每个服务都可能因为依赖服务的故障或网络不稳定而无法正常运行,这种情况在单机环境中几乎不会发生。假设我们有5个依赖服务,每个服务的可用性为99.95%,即每年大约有4个多小时不可用,那么整体可用性可能会降至99.75%(接近一天)。再加上网络不稳定和依赖服务的多样性,可用性会进一步降低。那么,如何在依赖服务不可用或网络不稳定的情况下,确保自身服务的稳定性呢?

Michael T. Nygard 在他的书中提到了两种关键的提升系统可用性的模式:超时和断路器。

首先,超时机制。网络调用外部依赖服务时,必须设置超时。健康的情况下,一次远程调用通常在几十毫秒内完成,但在网络拥堵或依赖服务不可用的情况下,这个时间可能会延长到好几秒甚至永远。没有超时机制的远程调用可能会导致一个线程或进程被长时间占用资源,从而导致系统资源耗尽,进而影响自身服务的可用性。因此,非核心依赖服务的不可用性可能会拖垮整个系统。

其次,断路器。类似于家庭中的保险丝,当电路过载或短路时,保险丝会烧断切断电路,避免更大的灾难。断路器在服务间依赖中发挥着类似的作用。当大量请求由于依赖服务不可用或超时而失败时,断路器会检测到超过50%的失败率或连续20次失败后,主动打开断路器,返回失败,避免资源浪费。断路器会在5分钟后尝试关闭,以判断依赖服务是否恢复。

Hystrix 是 Netflix 开源的弹性框架,提供了对远程依赖的保护。通过Hystrix,开发者可以将远程调用包装在 Command 中,设置超时和断路器。例如,以下代码展示了如何使用Hystrix封装远程调用:

public class GetCurrentTimeCommand : HystrixCommand
{ private static long currentTimeCache; public GetCurrentTimeCommand() : base(HystrixCommandSetter.WithGroupKey("TimeGroup") .AndCommandKey("GetCurrentTime") .AndCommandPropertiesDefaults( new HystrixCommandPropertiesSetter() .WithExecutionIsolationThreadTimeout(TimeSpan.FromSeconds(1.0)) .WithExecutionIsolationThreadInterruptOnTimeout(true))) {} protected override long Run() { using (new WebClient()) { string content = wc.DownloadString("http://tycho.usno.navy.mil/cgi-bin/time.pl"); XDocument document = XDocument.Parse(content); currentTimeCache = long.Parse(document.Element("usno").Element("t").Value); } return currentTimeCache; } protected override long GetFallback() { return currentTimeCache; }}

Hystrix默认会为 Command 分配线程池,池的大小默认为10,避免了过多线程占用资源。当命令数量超过阈值时,Hystrix会走fallback或抛异常。根据需求,可以调整线程池大小和其他属性。

Hystrix 的断路器机制默认启用,会统计命令失败率。当失败率超过50%时,断路器会打开,返回失败。5秒后,Hystrix会尝试关闭断路器,观察依赖服务的状态。

通过超时和断路器机制,Hystrix能够有效保护服务不受依赖不可用或网络不稳定的影响,从而保证系统的弹性和可用性。

转载地址:http://xlsfz.baihongyu.com/

你可能感兴趣的文章
python系列【仅供参考】:python 远程rdp
查看>>
python基础
查看>>
Python基本语法与变量类型
查看>>
python基本数据类型(容器)- tuple list dict set
查看>>
python基本工资的调整方案_Python薪资又涨了!这可咋办!
查看>>
Python基准测试和性能分析内存管理和垃圾回收
查看>>
Python基于RESTful风格的接口自动化测试实战
查看>>
python基于flask搭建http服务(四)—— Docker容器化部署
查看>>
python基于flask搭建http服务(二)—— 实现Excel上传、数据清洗、入库
查看>>
python基于flask搭建http服务(三)—— 使用gunicorn部署项目
查看>>
python基于flask搭建http服务(一)—— 实现数据查询和Excel导出
查看>>
Python块键盘/鼠标输入
查看>>
python在心理学研究中的应用有哪些_心理学在线研究可用平台简介和应用进展
查看>>
python在使用HTMLTestRunner时,报告为空,错误提示<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'>...
查看>>
python在gpu上运行_【python】python开启GPU加速
查看>>
Python在def函数中使用for循环
查看>>
Python在def函数中使用for循环
查看>>
Python在Conda环境中,但在Windows虚拟环境中没有激活
查看>>
python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
查看>>
python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
查看>>