GitHub 标星 11000+,阿里开源微服务如何连续 10 年扛住双十一大促

云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!

image
作者 | 宿何,阿里云高级开发工程师
责编 | 唐小引
封图 | CSDN 下载自东方 IC
出品 | CSDN(ID:CSDNnews)

疫情期间,“卡”成了很多人线上体验的关键词。线上预约购买口罩时,突然不能付款了;在线选课,被提示请求过多,系统无法响应;在线办公/教学时,图像或声音卡住了……这些可用性下降的场景严重的影响了用户体验,也降低了公司的工作效率。面对“卡”住了的情况 ,作为开发者的我们,需要预先通过一些手段来提前对不稳定的因素进行防护,同时在突发流量的情况下,也要具备快速止损的能力。

近年来,微服务的稳定性一直是开发者非常关注的话题。随着业务从单体架构向分布式架构演进以及部署方式的变化,服务之间的依赖关系变得越来越复杂,业务系统也面临着巨大的高可用挑战。

如何保障服务的可用性?这是一个非常庞大的话题,涉及到方方面面,其中一个重要的手段就是流控降级。

1、为什么要进行流控降级?

流量是非常随机性的、不可预测的。前一秒可能还风平浪静,后一秒可能就出现流量洪峰了(例如双 11 零点的场景)。然而我们的系统容量总是有限的,如果突如其来的流量超过了系统的承受能力,就可能会导致请求处理不过来,堆积的请求处理缓慢,CPU/Load 飙高,最终导致系统崩溃。因此,我们需要针对这种突发的流量来进行限制,在尽可能处理请求的同时来保障服务不被打垮。

一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。

现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的服务进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。

那么是不是服务的量级很小就不用进行限流防护了呢?是不是微服务的架构比较简单就不用引入熔断保护机制了呢?

其实,这与请求的量级、架构的复杂程度无关。很多时候,可能正是一个非常边缘的服务出现故障而导致整体业务受影响,造成巨大损失。我们需要具有面向失败设计的意识,在平时就做好容量规划和强弱依赖的梳理,合理地配置流控降级规则,做好事前防护,而不是在线上出现问题以后再进行补救。

那么大家可能想问:有没有什么方法来快速进行高可用防护呢?如何做到均匀平滑的用户访问?如何预防这些不稳定因素带来的影响?今天我们就来大家具体分享承载阿里巴巴近 10 年双十一大促稳定性场景的流量控制组件 —— Sentinel 的实践。

2、Sentinel:面向云原生微服务的流量控制、熔断降级组件

Sentinel 是阿里巴巴开源的,面向分布式服务架构的流量控制组件,目前在 GitHub 已收获 11,071 Star。主要以流量为切入点,从流量控制、流量整形、熔断降级、系统自适应保护等多个维度来帮助开发者保障微服务的稳定性。Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀、冷启动、消息削峰填谷、集群流量控制、实时熔断下游不可用服务等,是保障微服务高可用的利器。

GitHub 地址:
https://github.com/alibaba/Sentinel

image

Sentinel 里的两个核心概念 —— 资源与规则。资源(Resource)可以理解为需要进行防护的代码块(或调用),比如 SQL 访问、REST API 访问、Dubbo 服务调用、Reactive 响应式服务、API 网关的路由访问,甚至是任意的代码块,都可以作为 Sentinel 的资源。用户可以通过 Sentinel API 或注解手动进行资源埋点,或者通过 Sentinel 提供的框架适配模块引入依赖一键接入。规则则是针对某个资源进行的控制手段,比如我们可以针对某个服务、方法来配置流控规则、降级规则等来达到高可用防护的效果。

其核心特性与技术如下:

  • 基于滑动窗口结构的实时统计,性能好的同时又可以保证统计的准确性;
  • 高度可扩展能力:基础核心 + SPI 接口扩展能力,用户可以方便地扩展流控、通信、监控等功能;
  • 多样化的流量控制策略(资源粒度、调用关系、流控指标、流控效果等多个维度),提供分布式集群流控的能力,同时提供热点流量探测和防护的能力;
  • 对不稳定服务进行熔断降级和隔离;
  • 全局维度的系统负载自适应保护,根据系统水位实时调节流量;
  • 覆盖 API Gateway 场景,为 Spring Cloud Gateway、Zuul 提供网关流量控制的能力;
  • 云原生场景提供 Envoy 服务网格集群流量控制的能力;
  • 实时监控和规则动态配置管理能力。

同时,Sentinel 提供一个简单的所见即所得的控制台,可以接入控制台对服务进行实时监控,同时可以在控制台实时配置、管理规则:

image

下面介绍 Sentinel 的一些常见的使用场景和最佳实践:

在服务提供方(Service Provider)的场景下,我们需要保护服务提供方自身不被流量洪峰打垮。这时候通常根据服务提供方的服务能力进行流量控制,或针对特定的服务调用方进行限制。我们可以结合前期压测评估核心接口的承受能力,配置 QPS 模式的限流,当每秒的请求量超过设定的阈值时,会自动拒绝多余的请求。

为了避免调用其他服务时被不稳定的服务拖垮自身,需要在服务调用端(Service Consumer)对不稳定服务依赖进行隔离和熔断。手段包括信号量隔离、异常比例降级、RT 降级等多种手段。

当系统长期处于低水位的情况下,流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。这时候我们可以借助 Sentinel 的 WarmUp 流控模式控制通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,而不是在一瞬间全部放行。这样可以给冷系统一个预热的时间,避免冷系统被压垮。

利用 Sentinel 的匀速排队模式进行“削峰填谷”,把请求突刺均摊到一段时间内,让系统负载保持在请求处理水位之内,同时尽可能地处理更多请求。

利用 Sentinel 的网关流控特性,在网关入口处进行流量防护,同时可以针对不同用户、IP 来分别限制 API 的调用频率。

在 Istio+Envoy 架构下快速接入 Sentinel RLS token server,为 Envoy 集群提供全局流量控制的能力。

3、Sentinel 的开源生态

Sentinel 有着丰富的开源生态,覆盖微服务、API Gateway 与 Service Mesh 几大核心生态。Sentinel 开源不久就被纳入 CNCF Landscape 版图,并且也成为 Spring Cloud 官方推荐的流控降级组件之一。社区提供 Spring Cloud、Dubbo、gRPC 等常用框架的适配,开箱即用;同时支持 Reactive 生态,支持 Reactor、Spring WebFlux 异步响应式架构。Sentinel 也在逐渐覆盖 API Gateway 和 Service Mesh 场景,在云原生架构中发挥更大的作用。

image

4、Sentinel 多语言演进及未来展望

Sentinel 初期主要面向 Java 微服务,同时也在朝着多语言扩展的方向不断探索。去年中旬,Sentinel 推出 C++ 原生版本,同时针对 Service Mesh 场景,Sentinel 也推出了 Envoy 集群流量控制的支持,可以解决 Service Mesh 架构下多语言限流的问题。

近期,Sentinel 多语言俱乐部又迎来新的一员 —— Sentinel Go 首个原生版本正式发布,为 Go 语言的微服务提供流控降级、系统保护等特性的原生支持。开发者只需简单的几步即可快速接入 Sentinel,享受到以下能力:

  • 精确限制接口级别的 QPS,防止打垮核心接口。
  • 削峰填谷,激增的请求排队等待处理。
  • 自适应的系统维度流量保护,结合 load 等系统指标以及服务实时的请求量和响应时间来自动拒绝多余的流量,尽可能地提升吞吐量的同时保证服务不挂。
  • 实时的秒级监控能力,通过监控日志了解系统的实时流量情况。

Sentinel Go 开源地址:
https://github.com/alibaba/sentinel-golang

在接下来的版本中,Sentinel Go 将会陆续推出熔断降级、热点参数统计与流控等一系列的稳定性保障能力。同时,社区也会陆续提供与常用的框架和云原生组件的整合模块。

未来,Sentinel 还会朝着多语言和云原生的方向持续演进。Sentinel 目前已支持 Java、Go、C++ 三种语言,未来社区还会支持更多语言。同时我们会不断完善 API Gateway 及 Service Mesh 的流控场景,如原生 Istio Service Mesh 整合,方便开发者在各种云原生场景下快速接入 Sentinel 享受高可用防护的能力。社区后面也计划提供与 Prometheus 等云原生监控组件的整合,可以利用 Sentinel 的指标统计数据进行接口级别的监控,同时结合 K8S HPA 弹性机制、自适应流控等,来提供自动化的稳定性保障。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 --- Vite快速创建Vue项目

npm 命令 npm init vite-app 项目名称

轻松构建基于 Serverless 架构的弹性高可用音视频处理系统

作者 | 罗松(西流) 阿里巴巴技术专家 本文整理自架构师成长系列 2 月 12 日直播课程。 关注“阿里巴巴云原生”公众号,回复 “212”,即可获取对应直播回放链接及 PPT 下载链接。 前言 随着计算机技术和 Internet 的日新月异,视频点播技…

亚马逊云服务(AWS)中国与毕马威中国建立战略合作伙伴关系

2020年9月10日,亚马逊通技术服务(北京)有限公司(AWS中国)与毕马威企业咨询(中国)有限公司(毕马威中国)宣布已签署战略合作协议。 双方将充分利用各自的全球品牌影响力和资…

Vue3 --- vue-router4 编程导航

需求:简单实现登录页,点击登录按钮调转指定的页面 1. import { useRouter } from vue-router // 页面引入路由 2. setup(){ const router useRouter() // 定义路由 const login () >{ //点击登录按钮 router.push(/home) // 实现路由调…

学不动?Apache Member 教你评估实用技术的思路

导读:笔者从 2008 年开始工作到现在也有 11 个年头了,一路走来都在和数据打交道,做过很多大数据底层框架内核的开发 ( Hadoop,Pig,Tez,Spark,Livy ),现在是多个 Apache 项目的 PMC。…

docker sonarqube:7.7-community

创建挂载目录权限 mkdir /app/sonarqube/logs /app/sonarqube/conf /app/sonarqube/data /app/sonarqube/extensions -p chmod -R 777 /app/sonarqube/运行容器 docker run -d --name sonar -p 9090:9000 \-e ALLOW_EMPTY_PASSWORDyes \-e SONARQUBE_DATABASE_USERroot \-e S…

linux异步IO的几种方法及重点案例

异步IO的方法 在Linux下,有几种常见的异步I/O(Asynchronous I/O)机制可供选择。以下是其中一些主要的异步I/O机制: POSIX AIO(Asynchronous I/O):POSIX AIO是一种标准的异步I/O机制&#xff0c…

AI赋能案例—阿里云身份证OCR识别助力实现“无接触”式政务服务!

2020年初的这场疫情,是一场对突发性公共卫生事件应急处置的大考,也是对数字政务体系能力的检验。在保证不影响办事效率的情况,如何减少人员的接触是政务场景下的“防疫”关键!日前由一窗(北京)互联网科技研…

Vue项目 --- JSJDK微信分享朋友和朋友圈功能

1. 在Vue项目index.html引入官方js https://res.wx.qq.com/open/js/jweixin-1.4.0.js 2. src下新建文件夹 weixin/wxjdk.js,代码如下 import axios from axios export default { wxShowMenu: function() { let url location.href; //获取当前页面地址 axios.g…

Hive 终于等来了 Flink

Apache Spark 什么时候开始支持集成 Hive 功能?笔者相信只要使用过 Spark 的读者,应该都会说这是很久以前的事情了。 那 Apache Flink 什么时候支持与 Hive 的集成呢?读者可能有些疑惑,还没有支持吧,没用过&#xff1…

AWS拓展中国合作伙伴生态 加速企业数字化转型进程

在2020年9月9日举办的AWS合作伙伴峰会2020上,亚马逊云服务(AWS)宣布将携手APN合作伙伴进一步拓展中国合作伙伴生态,以更好地服务客户的数字化转型和数字创新需求。AWS宣布与毕马威、神州数码分别达成战略合作关系,结合…

docker nexus3

创建挂载目录赋予权限 mkdir -p /app/nexus3/nexus-data chmod 777 /app/nexus3/nexus-data运行容器 docker run -id \--privilegedtrue \--namenexus3 \--restartalways \-p 8085:8081 \-v /app/nexus3/nexus-data:/nexus-data \sonatype/nexus3

如何在 Flink 中规划 RocksDB 内存容量?

本文描述了一些配置选项,这些选项将帮助您有效地管理规划 Apache Flink 中 RocksDB state backend 的内存大小。在前面的文章[1]中,我们描述了 Flink 中支持的可选 state backend 选项,本文将介绍跟 Flink 相关的一些 RocksDB 操作&#xff0…

能力差的程序员90%输在这点上!CTO:其实都是瞎努力!

在大数据浪潮当中,数据分析是这个时代的不二“掘金技能”。我们每一个人,每天无时无刻都在生产数据,一分钟内,微博上新发的数据量超过10万,b站的视频播放量超过600万......这些庞大的数字,意味着什么&#…

DNS高可用设计--软件高可用

DNS是网络的基础服务,网络上的各种应用对DNS的依赖性很高。DNS的稳定,直接决定了上层应用服务的稳定。那如何保障DNS服务的高可用呢? 我们先来看下高可用的概念: 高可用 高可用(High availability)&#…

docker gitlab-ce

创建挂载目录赋予权限 mkdir /app/gitlab/config /app/gitlab/logs /app/gitlab/data -p chmod 777 /app/gitlab -R运行容器 docker run \ -d \ -p 443:443 -p 8080:80 -p 22222:22 \ --name gitlab \ --restart always \ -v /app/gitlab/config:/etc/gitlab \ -v /app/git…

十年磨一剑!支付宝自研数据库OceanBase通过阿里云向全球开放

近日,由支付宝自研的金融级分布式数据库OceanBase正式通过阿里云向全球开放,提供高可用、高性能、低成本的计算服务,企业可在云上获得“支付宝同款”的世界顶级数据库处理能力。 数据库和操作系统一样,是IT行业的重要基础软件&am…

20张图,带你搞懂高并发中的线程与线程池!

来源 | 码农的荒岛求生从这篇开始将会开启高性能、高并发系列,本篇是该系列的开篇,主要关注多线程以及线程池。一切要从CPU说起你可能会有疑问,讲多线程为什么要从CPU说起呢?原因很简单,在这里没有那些时髦的概念&…

React 常用UI库

流行的开源React UI组件库 http://www.material-ui.com/#/ 组件总览 - Ant Designhttps://ant.design/components/overview-cn/ 安装方式:yarn add antd ## 按需加载antd库样式 1. 安装:yarn add react-app-rewired customize-cra 2. 修改 package.j…

蚂蚁金服自研分布式关系数据库OceanBase上线阿里云

OceanBase于2020年3月在阿里云上完成了商业化,在公有云上正式对外开放。同步上线的还有相关的生态产品,包括集群管控(OCP:OceanBase Cloud Platform),诊断(OTA:OceanBase Tunning Advisor)&…