大家好,架构摆渡人。这是我的第5篇原创文章,还请多多支持。

上篇文章给大家推荐了一些限流的框架,如果说硬要我推荐一款,我会推荐Sentinel,Sentinel的限流模式分为两种,分别是单机模式和集群模式。今天我们就来学习下这两种模式的区别和使用场景。

单机流控

单机流控就是流控的效果只针对服务的一个实例,比如你的服务部署了三个实例分别在三台机器上。请求访问到了A实例的时候,如果触发了流控,那么只会限制A实例后面的请求,不会影响其他实例上的请求。

比如你单身的时候,每月的工资都花个精光。影响的只是你自己,跟别人没关系,因为你本来就是一个人生活,单身跟单机就强行关联在一起了。

单机流控相对来说比较简单,不依赖中心化的存储。每个服务内部只需要记录自身的一些访问信息即可判断出是否需要流控操作。

像Guava的RateLimiter就是典型的单机流控模式,将令牌数据全部存储在本地内存中,不需要有集中式的存储,不需要跟其他服务交互,自身就能完成流控功能。

集群流控

集群流控就是流控的效果针对整个集群,也就是服务的所有的实例,比如你的服务部署了三个实例分别在三台机器上。总体限流QPS为100,请求访问到了A实例的时候,如果触发了流控,那么此时其他的请求到B实例的时候,也会触发流控。

比如你结婚后,你和你老婆的工资是你们整个家庭的总收入。你每天出去玩,到处乱花钱,把钱花完了,你老婆想买衣服的时候,就被流控了,因为没钱了,这就是集群流控的含义。

使用场景对比

保护层面对比

单机流控更适合作为兜底保护的一种方式,比如我们单机限流总的请求量为2000,如果超过2000开始限流,这样就能保证当前服务在可承受的范围内进行处理。

如果我们用的是集群限流,假设当前集群内有10个节点,如果每个节点能承受2000的请求,那么加起来就是2万的请求。也就是说只要不超过2万个请求都不会触发限流。如果我们的负载均衡策略是轮询的话没什么问题,请求分布到各个节点上都比较均匀。但是如果负载均衡策略不是轮询,如果是随机的话,那么请求很有可能在某个节点上超过2000,这个时候其实这个节点是处理不了那么多请求的,最终会被拖垮,造成连锁反应。

准确度对比

比如我们的需求是限制总的请求次数为2000,如果是单机流控,那么也就是每个节点超过200就开始限流。还是前面的问题,如果请求分配不均匀的话,其实整体总量还没达到2000,但是某一个节点超过了200,就开始限流了,对用户体验不是很好。

所以集群限流适合用在有整体总量限制的场景,比如开放平台的API调用。

Sentinel集群流控

Sentinel里面集群限流有两种身份:

Token Client:集群流控客户端,会向 Token Server 请求 token。集群限流服务端会返回结果,告诉客户端是否限流。

Token Server:集群流控服务端,处理来自 Token Client 的请求,根据配置的集群规则判断是否应该允许通过。

在部署方面也分为两种形式:

独立部署

首先来看下独立部署的架构图,此图来自Sentinel文档:

就是单独部署一个Token Server,通过这个独立的Token Server来存储所有资源的访问数据,然后再根据配置的规则决定某个资源能否放行,是否需要执行限流操作。

因为集群流控必须要有一个中心去存储数据,所以也必须单独部署Token Server,单独部署隔离性好,但是整体架构的复杂度上去了。

另外还有一个必须要考虑的问题就是Token Server的高可用性。如果当前的Token Server挂掉了,需要有另一个节点立马接替,其实就是需要实现一个选举的功能。

如果Token Server部署多个节点,也给这些节点划分主,从的区别,实现了故障选举的逻辑。但还有另外一个问题需要考虑,就是节点之前的数据需要同步吧,不然故障切换后,新上任的节点没有之前的数据,就只能从零开始了。

数据同步如果用AP的形式,那么可以参考Eureka的双向同步机制。一但发生故障切换,还是会有极小的概念丢失数据,因为不是强一致性。

如果用CP的形式,那么可以参考Zookeeper里的数据一致性保证方式。

嵌入式部署

首先来看下嵌入式部署的架构图,此图来自Sentinel文档:

嵌入式部署跟独立部署的区别在于可以不用单独部署Token Server,而且将Token Server跟应用融合在一起,所以叫内嵌式。

嵌入式部署如果是Token Server的那个应用实例挂了,我们可以通过API将另一个应用切换成Token Server,但是这个动作一定要做成自动的,手动的就比较LOW。

另外不足的就是隔离性不好,虽然架构简单。Token Server和应用耦合在一起,如果此时应用的QPS很高,则势必会影响Token Server,反之也是一样。

总结

最后,做个总结吧!集群流控能够精确地控制整个集群的 QPS,结合单机限流兜底,可以更好地发挥流量控制的效果。

集群模式有一定的适用场景,同时采用集群模式对整个架构的复杂度也会提高,所以如果没有特别复杂的场景,建议大家直接用单机模式就行了,限流的阀值配置少一点,在压测极限的70%即可。

大家好,我是从古代穿越过来的美男子:架构摆渡人。我将把我的武功秘籍全部传授与你们,觉得有用请分享给身边的朋友。来个三连吧,感谢各位!

流量治理神器-Sentinel的限流模式,选单机还是集群?的更多相关文章

  1. 流量治理神器-Sentinel 究竟是怎么做到让业务方接入简单?

    大家好,我是架构摆渡人,这是流量治理系列的第10篇原创文章,如果有收获,还请分享给更多的朋友. 做业务开发,需要考虑业务的扩展性.做基础框架开发,需要考虑如何让业务方接入,使用简单,尽量不要耦合在业务 ...

  2. Spark运行模式_本地伪集群运行模式(单机模拟集群)

    这种运行模式,和Local[N]很像,不同的是,它会在单机启动多个进程来模拟集群下的分布式场景,而不像Local[N]这种多个线程只能在一个进程下委屈求全的共享资源.通常也是用来验证开发出来的应用程序 ...

  3. Spring Cloud Gateway 整合阿里 Sentinel网关限流实战!

    大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第八篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...

  4. Spring Cloud Alibaba | Sentinel: 服务限流基础篇

    目录 Spring Cloud Alibaba | Sentinel: 服务限流基础篇 1. 简介 2. 定义资源 2.1 主流框架的默认适配 2.2 抛出异常的方式定义资源 2.3 返回布尔值方式定 ...

  5. Spring Cloud Alibaba | Sentinel: 服务限流高级篇

    目录 Spring Cloud Alibaba | Sentinel: 服务限流高级篇 1. 熔断降级 1.1 降级策略 2. 热点参数限流 2.1 项目依赖 2.2 热点参数规则 3. 系统自适应限 ...

  6. SpringBoot 2.0 + 阿里巴巴 Sentinel 动态限流实战

    前言 在从0到1构建分布式秒杀系统和打造十万博文系统中,限流是不可缺少的一个环节,在系统能承受的范围内既能减少资源开销又能防御恶意攻击. 在前面的文章中,我们使用了开源工具包 Guava 提供的限流工 ...

  7. Spring Cloud微服务Sentinel+Apollo限流、熔断实战总结

    在Spring Cloud微服务体系中,由于限流熔断组件Hystrix开源版本不在维护,因此国内不少有类似需求的公司已经将眼光转向阿里开源的Sentinel框架.而以下要介绍的正是作者最近两个月的真实 ...

  8. Greenplum源码编译安装(单机及集群模式)完全攻略

    公司有个项目需要安装greenplum数据库,让我这个gp小白很是受伤,在网上各种搜,结果找到的都是TMD坑货帖子,但是经过4日苦战,总算是把greenplum的安装弄了个明白,单机及集群模式都部署成 ...

  9. Scala进阶之路-Spark独立模式(Standalone)集群部署

    Scala进阶之路-Spark独立模式(Standalone)集群部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们知道Hadoop解决了大数据的存储和计算,存储使用HDFS ...

随机推荐

  1. 用C++实现的有理数(分数)四则混合运算计算器

    实现目标 用C++实现下图所示的一个console程序: 其中: 1.加减乘除四种运算符号分别用+.-.*./表示, + 和 - 还分别用于表示正号和负号. 2.分数的分子和分母以符号 / 分隔. 3 ...

  2. .Net Core配置Configuration源码研究

    最近又研究了一下.NetCore配置选项的源码实现,又学习到了不少东西.这篇文章先写一下IConfiguration的学习成果,Options的后面补上 核心类 ConfigurationBuilde ...

  3. SQLServer数据库之连接查询

    SQLServer数据库之连接查询 表的连接查询的几种方法介绍: inner join on内连接,left join on 左连接 , rigth join on 右连接, full join on ...

  4. MySQL(四)——

    MySQL官方对索引的定义:索引(Index)是帮助MySQL高效获取数据的数据结构.因此索引的本质就是数据结构.索引的目的在于提高查询效率,可类比字典.书籍的目录等这种形式. 可简单理解为" ...

  5. Python+mirai开发QQ机器人起步教程(2021.9.9测试有效)

    参考:开发 mirai QQ机器人起步教程_叹之-CSDN博客_mirai python 本篇文章参考了以上博客,并对其中的失效内容和版本匹配问题进行了补充修改,实测能够成功运行.部分步骤的运行截图见 ...

  6. 【第二十篇】-Maven IntelliJ之Spring Cloud直播商城 b2b2c电子商务技术总结

    Maven IntelliJ IntelliJ IDEA 已经内建了对 Maven 的支持.我们在此例中使用的是 IntelliJ IDEA 社区版 11.1. IntelliJ IDEA 的一些特性 ...

  7. AES加密基本原理图解

    AES加密 Fright-Moch整理 AES简介 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的).对 ...

  8. CodeForce-811B Vladik and Complicated Book(水题)

    http://codeforces.com/problemset/problem/811/B 题意: 给定一个长度为 N 不重复的数字序列,然后对其进行 M 次询问. 每次询问含L,R,X三个值,问如 ...

  9. Django学习day03随堂笔记

    每日测验 """ 今日考题 1.什么是静态文件,django静态文件配置如何配置,如何解决接口前缀不断变化,html页面上路径的引用需要反复修改的问题 2.request ...

  10. 关于当前PHP脚本运行时系统信息相关函数

    我们的 PHP 在执行的时候,其实可以获取到非常多的当前系统相关的信息.就像很多开源的 CMS 一般会在安装的时候来检测一些环境信息一样,这些信息都是可以方便地动态获取的. 脚本文件运行时的系统用户相 ...