流量控制与熔断利器:Sentinel介绍

这是《百图解码支付系统设计与实现》专栏系列文章中的第(19)篇,也是流量控制系列的第(6)篇。点击上方关注,深入了解支付系统的方方面面。

本篇聊聊流量控制与熔断利器Sentinel,背后的原理,适用的场景及存在的不足。不涉及具体的配置,具体配置请参考官方文档。

1. 前言

在流量控制系列文章中的前五篇,分别介绍了固定时间窗口算法、滑动时间窗口算法、漏桶原理、令牌桶、消息中间件如何应用到分布式环境下流量与并发控制。

我们做个简单回顾:

固定窗口:算法简单,对突然流量响应不够灵活。超过流量的会直接拒绝,通常用于限流。

滑动窗口: 算法简单,对突然流量响应比固定窗口灵活。超过流量的会直接拒绝,通常用于限流。

漏桶算法:在固定窗口的基础之上,使用队列缓冲流量。提供了稳定的流量输出,适用于对流量平滑性有严格要求的场景。

令牌桶算法:在滑动窗口的基础之上,使用队列缓冲流量。提供了稳定的流量输出,且能应对突发流量。

分布式消息中间件:在支付场景的削峰填谷用得比较多,且对精度没有那么苛刻的场景。

今天介绍另一个流量控制和熔断机制利器:Sentinel。

需要说明的是,这里只是做简单介绍,更具体的使用,建议参考官方文档。

2. Sentinel简单介绍

图片来自网络。

Sentinel 是由阿里巴巴开源的一个轻量级的、高性能的流量控制、熔断降级的 Java 库。主要用于在分布式系统中保护服务的稳定性和可靠性,通过实现流量控制、熔断降级、系统负载保护等功能,来防止应用级别的故障和服务级别的雪崩效应。

主要特点

  1. 丰富的流量控制策略:Sentinel 提供了多种流量控制策略,如 QPS、线程数、响应时间等。
  2. 熔断降级机制:当资源的运行指标超过阈值时,Sentinel 可以自动进行熔断降级处理,防止系统过载。
  3. 系统负载保护:能够根据系统的负载情况,如 CPU 使用率、平均负载等,来自动调整流量入口。
  4. 实时监控和开放的指标:提供实时监控和丰富的指标数据,方便用户进行实时的流量监控和调整。
  5. 多维度规则授权:支持多种维度的规则配置,如调用关系、调用来源、API 级别等。
  6. 高可用性和可扩展性:Sentinel 的设计考虑了高可用性,易于扩展,支持与其他组件和服务的集成。
  7. 轻量级和高性能:其对系统的性能影响很小,非常适合高并发的场景。

3. 流量控制

Sentinel 的流量控制基于资源的定义、流量控制规则的设定以及运行时的流量控制处理。在 Sentinel 中,流量控制主要是通过对服务调用或资源访问的限制来实现的。

1. 资源的定义

在 Sentinel 中,资源通常是指需要被保护的服务调用点或关键代码段。例如,一个 HTTP 接口、一个内部定义的服务调用或一个数据库查询等都可以被定义为资源。

2. 流量控制规则

Sentinel 允许对每个资源设置流量控制规则。这些规则可以基于多种不同的标准,例如:

  • QPS(每秒查询次数):限制资源每秒可以处理的请求数。
  • 并发线程数:限制资源同时处理的最大并发请求数。
  • 响应时间:当资源的响应时间超过设定阈值时,可以触发流量控制措施。

3. 流量控制处理

一旦流量达到设定的阈值,Sentinel 会根据配置的流量控制效果来处理额外的流量。主要包括:

  • 直接拒绝(Fast Fail):立即拒绝访问请求,通常用于防止系统过载。
  • 预热(Warm Up):通过逐渐增加流量的方式来预热服务,适用于系统刚启动时。
  • 排队等待(Rate Limiter):使请求排队并逐个处理,保证系统稳定。排队还可以设定超时时间。

4.流量计算与排队

Sentinel 内部也是使用滑动时间窗口算法来计算资源的实时流量。有兴趣的同学可以自己去翻一下源代码。

排队通常使用先进先出(FIFO)的队列实现。

4. 熔断保护与自动恢复

熔断是一种保护系统的策略,当检测到某个微服务不稳定或者响应时间过长时,Sentinel会自动切断对该服务的请求,防止系统雪崩。Sentinel的熔断策略是基于RT(响应时间)、异常比例和异常数等不同的指标来实现的。一旦触发熔断规则,Sentinel会暂时阻断请求,直到服务恢复正常。

1. 熔断策略

Sentinel 提供多种熔断策略,典型的包括:

  • 慢调用比例:如果资源的响应时间超过阈值的调用比例超过设定值,则触发熔断。
  • 异常比例:如果资源的异常调用比例超过设定值,则触发熔断。
  • 异常数:如果在一个统计窗口内,资源的异常数超过设定值,则触发熔断。

2. 统计窗口

  • 滑动窗口:Sentinel 通常使用滑动窗口来统计资源的性能指标(如响应时间、调用异常等)。
  • 时间间隔:Sentinel 允许配置统计窗口的时间间隔,以便根据应用的实际需求调整熔断的灵敏度。

3. 熔断状态与自动化恢复

Sentinel 的熔断机制有三种状态:

  • 关闭:正常状态,请求正常处理。
  • 打开:熔断状态,所有对资源的请求都会被立即拒绝。
  • 半开:一段时间后,Sentinel 会自动将熔断器置为半开状态,允许部分请求通过以检测资源的健康状态。如果这些请求成功,则关闭熔断器;如果失败,则再次打开熔断器。

5. 支付系统应用场景

Sentinel广泛应用于微服务架构中,可以应对突发流量、分布式服务之间的依赖保护、系统负载过高等情况。在电商、支付、金融等行业随处可见。

我们主要用在各子域之间的限流。每年大促,就会梳理业务请求量,算出流量分布图,根据流量分布图,设置每个子应用各接口的限流值。

6. 无法适用的场景

Sentinel的限流有两种模式:1)总量除以机器数,然后做单机限流。2)拿出一台机器做集群结点,然后做集群限流。

但无论哪种模式都无法解决跨服务单元的限流。比如部署了两个机房,两个机房合用限流到1TPS,Sentinel是无法做到的。这个时候就需要用到我们前面几篇文章中讲到的自己实现的限流方案,比如漏桶,令牌桶等。

7. 结束语

在当前微服务架构的盛行的时代,Sentinel作为一个高效的流量控制与熔断工具,为确保系统的稳定性和可用性提供了强有力的支持。通过使用Sentinel,我们可以大大提高在线支付系统等复杂应用的稳定性和用户体验。

但另一方面,我们也需要知道不同的工具有不同的应用场景,Sentinel解决的是限流和熔断,消息中间件解决削峰填谷和应用间解耦,自己手撸一个漏桶或令牌桶解决极低TPS这种特殊场景。

8.精选

专栏地址百图解码支付系统设计与实现
《百图解码支付系统设计与实现》专栏介绍
《百图解码支付系统设计与实现》专栏大纲及文章链接汇总(进度更新于2023.1.15)
领域相关(部分)
支付行业黑话:支付系统必知术语一网打尽
跟着图走,学支付:在线支付系统设计的图解教程
图解收单平台:打造商户收款的高效之道
图解结算平台:准确高效给商户结款
图解收银台:支付系统承上启下的关键应用
图解支付引擎:资产流动的枢纽
图解渠道网关:不只是对接渠道的接口(一)

技术专题(部分)
交易流水号的艺术:掌握支付系统的业务ID生成指南
揭密支付安全:为什么你的交易无法被篡改
金融密语:揭秘支付系统的加解密艺术
支付系统日志设计完全指南:构建高效监控和问题排查体系的关键基石
避免重复扣款:分布式支付系统的幂等性原理与实践
支付系统的心脏:简洁而精妙的状态机设计与核心代码实现
精确掌控并发:固定时间窗口算法在分布式环境下并发流量控制的设计与实现
精确掌控并发:滑动时间窗口算法在分布式环境下并发流量控制的设计与实现

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

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

相关文章

CVE-2024-0195 利用分析

1. 漏洞介绍 SpiderFlow爬虫平台项目中spider-flow-web\src\main\java\org\spiderflow\controller\FunctionController.java文件的FunctionService.saveFunction函数调用了saveFunction函数,该调用了自定义函数validScript,该函数中用户能够控制 functi…

系统架构设计师

软考系统架构设计师笔记 专用的成电路(Application Specific Integrated Circuit,ASIC) PTR记录:Pointer Record,常被用于反向地址解析,即通过IP地址查询服务器域名。 软件工程 软件开发模型 【增量模型的优点】 …

大模型 RAG 面试篇

1.LLMs 存在模型幻觉问题,请问如何处理? 检索LLM。 先用问题在领域数据库里检索到候选答案,再用LLM对答案进行加工。 2.基于LLM向量库的文档对话 思路是怎么样? 加载文件读取文本文本分割文本向量化问句向量化在文本向量中匹配…

配置中心原理和选型

为什么需要配置中心? 缺乏整体管理,是配置管理变得低效 处于运维管理的需求 很容易导致实例的配置出现不一致的地方 生产环境多个集群直接修改配置,导致不一致 配置和代码在一起,配置修改需要重新发布,非常低效 目的是…

【C语言】编译和链接深度剖析

文章目录 📝前言🌠 翻译环境和运行环境🌉翻译环境 🌠预处理(预编译)🌉编译 🌠词法分析🌠语法分析 🌉语义分析🌠汇编 🌉 链接&#x1f…

【教程】集群搭建准备工作全流程

基于VMware创建虚拟机进行集群搭建,适用于hadoop/GreenPlum等集群 之前已经创建了三台虚拟机hadoop102,hadoop103,hadoop104来搭建hadoop集群,因为目前学习到了greemplum,因此新建三台虚拟机hadoop105,had…

ubuntu下通过ssh在两台计算机之间拷贝文件

参考:Linux 远程连接之 SSH 新手指南 - 知乎 (zhihu.com) 1、查看是否安装ssh客户端 (ubuntu下一般默认都安装了) file /etc/ssh/ssh_config 有回复则表示安装了,否则会回复“No such file or directory” 2、查看是否安装ss…

[go] 迭代器模式

迭代器模式 提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露其内部的表示。 模型说明 Iterator: 接口声明了遍历集合所需的操作: 获取下一个元素、 获取当前位置和重新开始迭代等。 IterableCollection: 接口声明一个或多个方法来获取与集合…

springboot110作业管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的作业管理系统 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资…

html css js 开发一个猜数字游戏

以下是一个使用HTML、CSS和JS开发的简单猜数字游戏的示例&#xff1a; HTML代码&#xff1a; <!DOCTYPE html> <html> <head><title>猜数字游戏</title><link rel"stylesheet" type"text/css" href"style.css&quo…

java基本语法(内涵与C++的不同)

java语法 在介绍java中&#xff0c;我会去书写一些java语言与C的不同点。 目录 java语法 变量、运算符、输入与输出 内置数据类型 常量 运算符 两种输入输出 输入 方法一 方法二 输出 方法一 方法二 判断语句 if-else语句 switch语句 逻辑表达式和条件运算符 循环语句 …

vue.js安装

1:下载 Node.js 官网&#xff1a;https://nodejs.org/en/download 2:安装 node -v npm -v 3:配置 npm config set prefix "F:\node\node_global" npm config set cache "F:\node\node_cache" 按 win 键并输入“编辑系统环境变量”调出系统属性界面&a…

AWTK 开源串口屏开发(7) - 屏幕保护

现代屏幕其实并不需要屏幕保护&#xff0c;不过屏幕保护程序会衍生一些其它用途。比如&#xff1a; 保护隐私。长时间不操作&#xff0c;通过动画或者其它方式隐藏屏幕内容。数据安全。长时间不操作&#xff0c;需要输入密码才能恢复。美观/广告。长时间不操作&#xff0c;显示…

C++中的static(静态)

2014年1月19日 内容整理自The Cherno:C系列 2014年1月20日 内容整理自《程序设计教程&#xff1a;用C语言编程 第三版》 陈家骏 郑滔 -----------------------------------------------------------------------------------------------------------------------------…

JS执行顺序

众所周知&#xff0c;JavaScript 是单线程语言,只能同时执行做一件事(js只有一个线程&#xff0c;称之为main thread-主线程) 1.Javascript 运行机制 main thread 主线程和 call-stack 调用栈(执行栈)&#xff0c;所有的任务都会被放到调用栈等待主线程执行。 2.Javascript 任…

SpringBoot+beetl idea热更新解决方案

SpringBootbeetl idea热更新解决方案 第一在application中开启&#xff1a; beetl:resource-auto-check: true #热加载beetl模板&#xff0c;开发时候用第二在application中开启&#xff1a; devtools: 这个部分专门用于配置Spring Boot DevTools的相关参数。DevTools…

Centos8中yum安装docker问题

问题&#xff1a;执行yum update 报错 problem with installed package containers-common-2:1-2.module_el8.5.08906b136101.noarch 执行下面的containerd.io版本安装即可 yum install https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.…

Java SE入门及基础(23)

目录 方法带参 1. 构造方法带参 案例场景 思考&#xff1a;以上代码存在什么问题&#xff1f; 2. 方法带参 方法带参语法 案例场景 思考&#xff1a;以上代码存在什么问题&#xff1f; Java SE文章参考:Java SE入门及基础知识合集-CSDN博客 方法带参 1. 构造方法带参 …

十八周周报

文章目录 摘要文献阅读3D reconstruction of human bodies from single-view and multi-view images: A systematic review简介研究方法搜索策略选择标准搜索结果 三维重建方法单个视图中使用的技术基于参数化人体模型的回归基于非参数人体模型的回归 多个视图中使用的技术基于…

base64图片是什么?原理是什么?优缺点是什么?

Base64图片是一种将图像数据编码为文本字符串的方法&#xff0c;通常用于将图像嵌入到网页或其他文档中&#xff0c;以减少HTTP请求或实现某些特定的需求。Base64编码的原理是将3个8位的字节转化为4个6位的字节&#xff0c;然后在6位的前面补两个0&#xff0c;形成8位一个字节的…