做者 | 宿何 阿里云高级开发工程师git
导读:疫情期间,“卡”成了不少人线上体验的关键词。线上预定购买口罩时,忽然不能付款了;在线选课,被提示请求过多,系统没法响应;在线办公/教学时,图像或声音卡住了……这些可用性降低的场景严重的影响了用户体验,也下降了公司的工做效率。面对“卡”住了的状况 ,做为开发者的咱们,须要预先经过一些手段来提早对不稳定的因素进行防御,同时在突发流量的状况下,也要具有快速止损的能力。
近年来,微服务的稳定性一直是开发者很是关注的话题。随着业务从单体架构向分布式架构演进以及部署方式的变化,服务之间的依赖关系变得愈来愈复杂,业务系统也面临着巨大的高可用挑战。github
如何保障服务的可用性?这是一个很是庞大的话题,涉及到方方面面,其中一个重要的手段就是流控降级。数据库
流量是很是随机性的、不可预测的。前一秒可能还风平浪静,后一秒可能就出现流量洪峰了(例如 双11 零点的场景)。架构
然而咱们的系统容量老是有限的,若是突如其来的流量超过了系统的承受能力,就可能会致使请求处理不过来,堆积的请求处理缓慢,CPU/Load 飙高,最终致使系统崩溃。所以,咱们须要针对这种突发的流量来进行限制,在尽量处理请求的同时来保障服务不被打垮。并发
一个服务经常会调用别的模块,多是另外的一个远程服务、数据库,或者第三方 API 等。框架
例如,支付的时候,可能须要远程调用银联提供的 API;查询某个商品的价格,可能须要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。若是依赖的服务出现了不稳定的状况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务自己也变得不可用。less
现代微服务架构都是分布式的,由很是多的服务组成。不一样服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终致使整个链路都不可用。所以咱们须要对不稳定的服务进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素致使总体的雪崩。异步
那么是否是服务的量级很小就不用进行限流防御了呢?是否是微服务的架构比较简单就不用引入熔断保护机制了呢?分布式
其实,这与请求的量级、架构的复杂程度无关。不少时候,可能正是一个很是边缘的服务出现故障而致使总体业务受影响,形成巨大损失。咱们须要具备面向失败设计的意识,在平时就作好容量规划和强弱依赖的梳理,合理地配置流控降级规则,作好事前防御,而不是在线上出现问题之后再进行补救。ide
那么你们可能想问:有没有什么方法来快速进行高可用防御呢?如何作到均匀平滑的用户访问?如何预防这些不稳定因素带来的影响?今天咱们就来你们具体分享承载阿里巴巴近 10 年双十一大促稳定性场景的流量控制组件 —— Sentinel 的实践。
Sentinel 是阿里巴巴开源的,面向分布式服务架构的流量控制组件,目前在 GitHub 已收获 11,071 Star。
该组件主要以流量为切入点,从流量控制、流量整形、熔断降级、系统自适应保护等多个维度来帮助开发者保障微服务的稳定性。Sentinel 承接了阿里巴巴近 10 年的 双11 大促流量的核心场景,例如秒杀、冷启动、消息削峰填谷、集群流量控制、实时熔断下游不可用服务等,是保障微服务高可用的利器。
Sentinel 里的两个核心概念 —— 资源与规则。资源(Resource)能够理解为须要进行防御的代码块(或调用),好比 SQL 访问、REST API 访问、Dubbo 服务调用、Reactive 响应式服务、API 网关的路由访问,甚至是任意的代码块,均可以做为 Sentinel 的资源。
用户能够经过 Sentinel API 或注解手动进行资源埋点,或者经过 Sentinel 提供的框架适配模块引入依赖一键接入。规则则是针对某个资源进行的控制手段,好比咱们能够针对某个服务、方法来配置流控规则、降级规则等来达到高可用防御的效果。
其核心特性与技术以下:
同时,Sentinel 提供一个简单的所见即所得的控制台,能够接入控制台对服务进行实时监控,同时能够在控制台实时配置、管理规则:
下面介绍 Sentinel 的一些常见的使用场景和最佳实践:
在服务提供方(Service Provider)的场景下,咱们须要保护服务提供方自身不被流量洪峰打垮。这时候一般根据服务提供方的服务能力进行流量控制,或针对特定的服务调用方进行限制。咱们能够结合前期压测评估核心接口的承受能力,配置 QPS 模式的限流,当每秒的请求量超过设定的阈值时,会自动拒绝多余的请求。
为了不调用其余服务时被不稳定的服务拖垮自身,须要在服务调用端(Service Consumer)对不稳定服务依赖进行隔离和熔断。手段包括信号量隔离、异常比例降级、RT 降级等多种手段。
当系统长期处于低水位的状况下,流量忽然增长时,直接把系统拉升到高水位可能瞬间把系统压垮。这时候咱们能够借助 Sentinel 的 WarmUp 流控模式控制经过的流量缓慢增长,在必定时间内逐渐增长到阈值上限,而不是在一瞬间所有放行。这样能够给冷系统一个预热的时间,避免冷系统被压垮。
利用 Sentinel 的匀速排队模式进行“削峰填谷”,把请求突刺均摊到一段时间内,让系统负载保持在请求处理水位以内,同时尽量地处理更多请求。
利用 Sentinel 的网关流控特性,在网关入口处进行流量防御,同时能够针对不一样用户、IP 来分别限制 API 的调用频率。在 Istio+Envoy 架构下快速接入 Sentinel RLS token server,为 Envoy 集群提供全局流量控制的能力。
Sentinel 有着丰富的开源生态,覆盖微服务、API Gateway 与 Service Mesh 几大核心生态。
Sentinel 开源不久就被归入 CNCF Landscape 版图,而且也成为 Spring Cloud 官方推荐的流控降级组件之一。社区提供 Spring Cloud、Dubbo、gRPC 等经常使用框架的适配,开箱即用;同时支持 Reactive 生态,支持 Reactor、Spring WebFlux 异步响应式架构。Sentinel 也在逐渐覆盖 API Gateway 和 Service Mesh 场景,在云原生架构中发挥更大的做用。
Sentinel 初期主要面向 Java 微服务,同时也在朝着多语言扩展的方向不断探索。去年中旬,Sentinel 推出 C++ 原生版本,同时针对 Service Mesh 场景,Sentinel 也推出了 Envoy 集群流量控制的支持,能够解决 Service Mesh 架构下多语言限流的问题。
近期,Sentinel 多语言俱乐部又迎来新的一员 —— Sentinel Go 首个原生版本正式发布,为 Go 语言的微服务提供流控降级、系统保护等特性的原生支持。开发者只需简单的几步便可快速接入 Sentinel,享受到如下能力:
在接下来的版本中,Sentinel Go 将会陆续推出熔断降级、热点参数统计与流控等一系列的稳定性保障能力。同时,社区也会陆续提供与经常使用的框架和云原生组件的整合模块。
将来,Sentinel 还会朝着多语言和云原生的方向持续演进。
Sentinel 目前已支持 Java、Go、C++ 三种语言,将来社区还会支持更多语言。同时咱们会不断完善 API Gateway 及 Service Mesh 的流控场景,如原生 Istio Service Mesh 整合,方便开发者在各类云原生场景下快速接入 Sentinel 享受高可用防御的能力。
社区后面也计划提供与 Prometheus 等云原生监控组件的整合,能够利用 Sentinel 的指标统计数据进行接口级别的监控,同时结合 K8S HPA 弹性机制、自适应流控等,来提供自动化的稳定性保障。
若是你符合如下条件,欢迎投递简历加入咱们!
简历投递通道:cloudnativehire@list.alibaba-inc.com
“ 阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,作最懂云原生开发者的公众号。”