一、服务雪崩

分布式系统环境下,服务间依赖非常常见,一个业务调用通常依赖多个基础服务。对于同步调用,当某服务不可用时,服务请求线程被阻塞,当有大批量请求调用该不可用服务时,最终可能导致整个系统服务资源耗尽,无法继续对外提供服务。并且这种不可用会沿请求调用链向上传递,这种现象被称为雪崩效应。

1.雪崩效应常见场景 硬件故障:如服务器宕机,机房断电,光纤被挖断等。 流量激增:如异常流量,重试加大流量等。 缓存穿透:一般发生在应用重启,所有缓存失效时,以及短时间内大量缓存失效时。大量的缓存不命中,使请求直击后端服务,造成服务提供者超负荷运行,引起服务不可用。 程序BUG:如程序逻辑导致内存泄漏,JVM长时间FullGC等。 同步等待:服务间采用同步调用模式,同步等待造成的资源耗尽。 2.雪崩效应应对策略 针对造成雪崩效应的不同场景,可以使用不同的应对策略,没有一种通用所有场景的策略,参考如下:

硬件故障:多机房容灾、异地多活等。 流量激增:服务自动扩容、流量控制(限流、关闭重试)等。 缓存穿透:缓存预加载、缓存异步加载等。 程序BUG:修改程序bug、及时释放资源等。 同步等待:资源隔离、MQ解耦、不可用服务调用快速失败等。资源隔离通常指不同服务调用采用不同的线程池;不可用服务调用快速失败一般通过熔断器模式结合超时机制实现。

二、实际场景中常用的限流策略

1.Gateway限流

按照一定的规则如帐号、IP、系统调用逻辑等在Gateway层面做限流

2.业务应用系统限流

  • 客户端限流 (这里的客户端不是指的app/web之类的,比如A服务调用B服务,我们可以把A服务当做是B服务的客户端)
  • 服务端限流

3.数据库限流

红线区,力保数据库

三、Hystrix 简介

Hystrix是Netflix开源的一款容错系统,能帮助使用者写出具备强大的容错能力和鲁棒性的程序。 容错性我们很好理解,那什么是鲁棒性?

鲁棒性的定义

它是在异常和危险情况下系统生存的关键。比如说,计算机软件在输入错误、磁盘故障、网络过载或有意攻击情况下,能否不死机、不崩溃,就是该软件的鲁棒性。所谓“鲁棒性”,是指控制系统在一定(结构,大小)的参数摄动下,维持其它某些性能的特性。根据对性能的不同定义,可分为稳定鲁棒性和性能鲁棒性。以闭环系统的鲁棒性作为目标设计得到的固定控制器称为鲁棒控制器。

Hystrix作用

  • 通过控制延迟和故障来保障第三方服务调用的可靠性
  • 在复杂的分布式系统中防止级联故障,防止雪崩
  • 快速失败、快速恢复
  • 回退并优雅降级
  • 提供近实时监控、报警和操作控制

Hystrix遵循的设计原则:

防止任何单独的依赖耗尽资源(线程) 过载立即切断并快速失败,防止排队 尽可能提供回退以保护用户免受故障 使用隔离技术(例如隔板,泳道和断路器模式)来限制任何一个依赖的影响 通过近实时的指标,监控和告警,确保故障被及时发现 通过动态修改配置属性,确保故障及时恢复 防止整个依赖客户端执行失败,而不仅仅是网络通信