Skip to content
Eric Zhao edited this page Nov 27, 2020 · 8 revisions
Sentinel Logo

Sentinel Go 最新文档已迁移至 Sentinel 官方网站,wiki 中的使用文档不再进行更新。


Sentinel 是什么

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护等多个维度来帮助您保障微服务的稳定性。

Sentinel 的历史

  • 2012年,Sentinel 诞生,主要功能为入口流量控制。
  • 2013-2017年,Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。
  • 2018年,Sentinel 开源,并持续演进。
  • 2019年,Sentinel 在多语言扩展的方向上逐步探索,陆续推出 C++ 原生版本、Envoy 集群流量控制支持。
  • 2020年,Sentinel 推出 Go 原生版本,期待在云原生领域继续突破。

Sentinel 基本概念

资源

资源是 Sentinel 的关键概念。它可以是程序中的任何内容,例如,某个微服务调用,或由应用程序调用的其它应用提供的服务,甚至可以是一段简单的代码。在接下来的文档中,我们都会用资源来描述代码块。

只要通过 Sentinel API 定义的代码块,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL 或者服务名称作为资源名来标示资源。

规则

围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则、系统保护规则以及用户自己扩展的规则。所有规则都可以动态实时调整。

Sentinel 功能和设计理念

流量控制

什么是流量控制

流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:

traffic-shaping

流量控制设计理念

流量控制有以下几个角度:

  • 资源和资源之间的关系;
  • 运行指标,例如 QPS、线程池、系统负载等;
  • 控制的效果,例如直接限流、冷启动、匀速+排队等待等。

Sentinel提供了几个组件让用户去实现相关的流控方案:

  1. 基于QPS的流量控制:流量控制
  2. 基于协程数的隔离流控:并发隔离控制
  3. 基于热点参数的流量控制:热点参数限流
  4. 基于系统指标的自适应流控:系统自适应流控

Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。

熔断降级与并发控制

除了流量控制以外,及时对调用链路中的不稳定因素进行熔断也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,可能会导致请求发生堆积,进而导致级联错误。

image

Sentinel 通过以下的手段来保护自身不被不稳定依赖服务拖垮:

  • 并发隔离控制:当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成并发数的逐步堆积。当并发数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝,直到堆积的调用完成后才开始继续接收请求。
  • 基于响应时间(慢调用比例)或错误(错误计数或错误比例)的自动熔断

系统自适应保护

Sentinel 同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。

针对这个情况,Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。

Sentinel 是如何工作的

Sentinel 的主要工作机制如下:

  • 对主流框架提供适配或者显示的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。
  • 根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时,Sentinel 提供开放的接口,方便您定义及改变规则。
  • Sentinel 提供实时的监控能力,方便您快速了解目前系统的状态。

社区交流

Sentinel Go 开源讨论群(钉钉群):23339422