在微服务框架中,我们将系统拆分成了很多服务单元,各个服务单元的应用之间通过服务注册与订阅的方式相互依赖。由于每一个服务单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或者是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方法请求不断增加,最后就会形成任务积压,最终导致服务的瘫痪。
如下图:
上图中,“服务A”大量调用“服务B”,而“服务B”存在异常,导致了很多调用挤压。
在微服务架构中,存在着那么多的服务单元,若一个单元出现故障,就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构更加不稳定。为了解决这样的问题,产生了断路器等一系列的服务保护机制。
断路器(Circuit Breaker)是一种在分布式系统中用于处理故障和保护系统稳定性的重要机制。
断路器的设计灵感来源于电路中的断路器。在电路中,当电流过大等异常情况发生时,断路器会自动切断电路,以防止电器设备因过载而损坏。类似地,在分布式系统中,当某个服务出现故障或响应时间过长等异常情况时,断路器会“切断”对该服务的请求,避免故障的扩散和对系统资源的过度消耗,从而保证整个系统的稳定性和可用性。
Hystrix 是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互。Hystrix 通过隔离服务之间的访问点、停止级联失败和提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性。
Hystrix 被设计的目标是:
Hystrix 通过隔离不同服务的请求、设置超时时间和熔断器等机制,能够快速地切断对故障服务的请求,防止故障的蔓延和扩散,从而有效地避免雪崩效应的发生,保障整个系统的稳定性。
当某个服务不可用或响应缓慢时,Hystrix 能够提供一种降级策略,使得系统可以以一种有损但仍然可用的方式继续运行。
Hystrix 采用舱壁隔离模式,将不同服务的请求隔离开来,避免一个服务的故障影响到其他服务。它通过为每个服务分配独立的线程池或信号量等资源,限制每个服务所占用的系统资源,使得即使某个服务出现问题,也不会耗尽整个系统的资源,从而保证其他服务能够正常运行。
Hystrix 提供了强大的监控和度量功能,能够实时地收集和统计服务的请求数据,如请求次数、成功次数、失败次数、响应时间等。通过这些数据,可以直观地了解服务的运行状态和性能表现,及时发现潜在的问题和性能瓶颈。
Hystrix 的设计遵循了一系列原则,这些原则共同支撑了其在分布式系统中实现强大的容错和保护功能,以下是对这些设计原则的详细介绍:
线程池隔离:Hystrix 为每个依赖服务分配独立的线程池,使得不同服务的请求在不同的线程池中执行。这样一来,当某个服务出现故障或延迟时,只会影响到该服务对应的线程池,而不会阻塞其他服务的线程,从而实现了服务之间的资源隔离。
信号量隔离:除了线程池隔离,Hystrix 还支持信号量隔离机制。信号量用于限制对某个资源的并发访问数量,通过为每个依赖服务设置信号量,可以控制同时访问该服务的请求数量。当信号量达到上限时,新的请求将被拒绝,从而避免了因过多请求导致系统资源耗尽的问题。
快速失败:当服务的失败率超过一定阈值时,Hystrix 的熔断器会迅速打开,后续对该服务的请求将直接被熔断器截断,不再发送到实际的服务提供者,而是立即执行降级逻辑,快速返回错误信息或预设的默认值。
自动恢复:熔断器在打开一段时间后,会进入半开状态,此时会允许少量请求通过熔断器发送到服务端,以测试服务是否已经恢复正常。如果这些请求能够成功响应,说明服务可能已经恢复正常,熔断器会逐渐恢复到关闭状态,重新允许正常的请求流量通过;如果请求仍然失败,则熔断器会再次打开,继续等待下一次的恢复尝试。
优雅降级:Hystrix 提供了灵活的降级策略,允许开发人员根据不同的业务场景和需求定义降级逻辑。当服务不可用或响应缓慢时,可以返回缓存中的数据、预设的默认值、友好的提示信息或执行其他备用的业务逻辑,以实现优雅降级。
降级策略的多样性:支持多种降级触发条件和降级处理方式,除了基于服务的失败率进行降级外,还可以根据响应时间、并发请求数量等指标来触发降级。
全面的监控指标:Hystrix 收集和记录了丰富的监控指标,包括请求次数、成功次数、失败次数、失败率、响应时间、线程池状态等。这些指标能够全面地反映服务的运行状态和性能表现,为开发人员提供了深入了解系统行为的依据。
实时监控和可视化:支持实时监控和可视化展示监控数据,开发人员可以通过仪表盘、图表等直观的方式查看服务的各项指标数据,实时了解系统的运行情况。
可配置的参数:Hystrix 的各项功能都具有高度的可配置性,开发人员可以根据具体的业务需求和系统环境,灵活地调整参数。
动态配置更新:支持在不重启服务的情况下动态更新配置参数,使得系统能够根据实际运行情况及时调整容错策略和性能优化措施。
易于集成:Hystrix 设计为能够与各种常见的分布式框架和技术栈无缝集成,如 Spring Cloud、Netflix OSS 等。通过简单的配置和注解,就可以在现有的分布式系统中轻松启用 Hystrix 的功能,无需对系统架构进行大规模的修改。
框架无关性:虽然 Hystrix 与许多框架都有良好的集成,但它本身并不依赖于特定的框架,具有较高的框架无关性。这意味着 Hystrix 可以在不同的技术框架和环境中使用,只要遵循其基本的设计原则和接口规范,就能够实现类似的容错和保护功能,为开发人员提供了更大的选择空间和灵活性。
Hystrix 的设计原则涵盖了资源隔离、熔断器、降级、监控和度量、配置灵活性以及与框架集成等多个方面,这些原则相互配合,共同为分布式系统提供了一套全面、强大且灵活的容错和保护机制,帮助开发人员构建更加稳定、可靠和弹性的分布式应用。
后续章节将介绍更多关于 Hystrix 相关知识。