自动开关降级的方式一般是当系统达到某些设定的条件 (系统负载, 资源使用情况, SLA 等指标) 之后, 自动执行一些策略.
常见的可以作为自动降级条件的指标有以下几个:
服务超时
当访问的数据库 / http 服务 / 远程调用响应慢或者长时间响应慢, 且该服务不是核心服务的话可以在超时后自动降级;
比如前面提到的详情页上有推荐和收藏功能, 即使出现问题也不会影响用户的正常下单. 如果是调用别人的远程服务, 和对方定义一个服务响应最大时间, 如果超时了则可以自动降级.
失败次数
调用外部服务的时候, 除了超时意外, 最常见的异常情况就是调用失败. 比如详情页中的库存信息, 如果是某一次查询请求失败了, 那么可以那么就可以通过读取缓存数据等方式直接降级掉.
但是, 这种降级可能存在一个问题, 就是虽然一次请求展示了缓存, 但是其他用户访问的时候还是会查询库存信息, 这对于库存系统来说就是雪上加霜. 因为他可能已经有问题了, 但是上游系统还是在不断的对他发送请求.
所以, 可以针对这个查询库存的接口做统一的降级. 设定一个失败次数的阈值, 一旦整体失败次数达到这个阈值了, 就对后续一段时间内的改查询接口做降级. 直到其功能恢复.
发生故障
上面提到的失败可能是服务不稳定造成的, 过一段时间可以自动恢复的. 还有一种情况可能是依赖的服务彻底跪了, 或者网络不通了等等. 这种情况就可以直接降级了.
当 HTTP 请求返回固定的错误码, 或者一个 RPC 请求的时候底层服务抛了异常以后, 就认为有故障发生, 对其进行降级即可.
限流降级
还有种电商网站常见的策略, 那就是限流降级. 对于某些功能, 设定一个流量阈值, 一旦流量达到阈值的话, 就进行降级.
比如秒杀功能, 如果一瞬间流量太大, 就可以进行限流降级. 对于后续访问的用户直接提示已售空, 跳转错误页, 或者让他输入验证码重试等.
人工开关降级
还有一种降级方式, 那就是人工开关降级.
人工开关降级的方式是指当系统维护人员在发现系统异常之后, 通过人工修改参数, 关闭服务等方式进行降级的方法.
这种方式的好处是比较灵活, 能够根据异常情况灵活应对; 但弊端是对人的要求比较高, 一来需要维护人员对系统有足够的了解, 另外要求维护人员在系统异常时能够在第一时间进行处置.
还有一种情况, 可能也会人工介入, 那就是在大促之前, 预估到流量会十分巨大, 提早的识别出风险, 为了节省资源保证主流程的可用, 开发人员可以手动将某个功能降级掉.
这里说的人工开关降级, 并不一定是一定要人工操作, 也可能是人工通过一个定时任务进行定时触发的.
降级工具
目前市面上, 针对流量控制, 限流降级主要有以下两种选择: Netflix Hystrix 和 Alibaba Sentinal.
Hystrix
Hystrix 是一个库, 它提供了服务与服务之间的容错功能, 主要体现在延迟容错和容错, 从而做到控制分布式系统中的联动故障. Hystrix 通过隔离服务的访问点, 阻止联动故障, 并提供故障的解决方案, 从而提高了这个分布式系统的弹性.
Hystrix 的关注点在于以 隔离 和 熔断 为主的容错机制, 超时或被熔断的调用将会快速失败, 并可以提供 fallback 机制.
Sentinel
Sentinel 是阿里中间件团队开源的, 面向分布式服务架构的轻量级高可用流量控制组件, 主要以流量为切入点, 从流量控制, 熔断降级, 系统负载保护等多个维度来帮助用户保护服务的稳定性.
Sentinel 的侧重点在于: 多样化的流量控制, 熔断降级, 系统负载保护, 实时监控和控制台等
对比

来源: http://www.tuicool.com/articles/MryMZvJ