博客
关于我
使用Hystrix提高系统可用性
阅读量:449 次
发布时间: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/

你可能感兴趣的文章
oracle 学习
查看>>
oracle 定义双重循环例子
查看>>
ORACLE 客户端工具连接oracle 12504
查看>>
Oracle 客户端连接时报ORA-01019错误总结
查看>>
oracle 导出sql数据库表结构,使用sql developer 导出Oracle数据库中的表结构
查看>>
oracle 嵌套表 例子,Oracle之嵌套表(了解)
查看>>
Oracle 常用命令
查看>>
Oracle 常用的V$视图脚本(二)
查看>>
Oracle 并行原理与示例总结
查看>>
oracle 并集 时间_Oracle集合运算符 交集 并集 差集
查看>>
Oracle 序列sequence 开始于某个值(10)执行完nextval 发现查出的值比10还小的解释
查看>>
ORACLE 异常错误处理
查看>>
oracle 执行一条查询语句,把数据加载到页面或者前台发生的事情
查看>>
oracle 批量生成建同义词语句和付权语句
查看>>
oracle 抓包工具,shell 安装oracle和pfring(抓包) 及自动环境配置
查看>>
Oracle 拆分以逗号分隔的字符串为多行数据
查看>>
Oracle 排序中使用nulls first 或者nulls last 语法
查看>>
oracle 插入date日期类型的数据、插入从表中查出的数据,使用表中的默认数据
查看>>
Oracle 操作笔记
查看>>
oracle 数据库 安装 和优化
查看>>