大家好,架构摆渡人。这是我的第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. 【XSS】XSS修炼之独孤九剑

    题目地址 xcao.vip/test 题目作者给出的解题思路 http://xcao.vip/test/xss/XSS修炼之独孤九剑.pdf 独孤九剑-第一式 题目 过滤了等号 =.小括号 (),要求 ...

  2. go 发送post请求(键值对、上传文件、上传zip)

    一.post请求的Content-Type为键值对 1.PostForm方式 package main import ( "net/http" "net/url" ...

  3. 手工添加数据到Chart

    private void button1_Click(object sender, EventArgs e) { //清除Series chart1.Series.Clear(); Random ra ...

  4. JS003. 事件监听和监听滚动条的三种参数( addEventListener( ) )

    全局 1 window.addEventListener('scroll', () => { 2 console.log('------') 3 console.log(document.doc ...

  5. springmvc配置过程中遇到的一些问题总结

    springmvc配置过程中遇到的一些问题总结 1.配置tomcat过程中的错误: 2.配置web.xml中DispatchServlet报红(配置好已有依赖条件下) 解决的办法: 因为新添加依赖,m ...

  6. java设计模式,工厂,代理模式等

    javaEE设计模式: 工厂模式:主要分为三种模式: 定义:在基类中定义创建对象的一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟到子类中进行. 为什么要使用工厂模式: (1) 解耦 : ...

  7. PHP设计模式之访问者模式

    访问者,就像我们去别人家访问,或者别人来我们家看望我们一样.我们每个人都像是一个实体,而来访的人都会一一的和我们打招呼.毕竟,我们中华民族是非常讲究礼数和好客的民族.访问者是GoF23个设计模式中最复 ...

  8. 5UCMS判断当前栏目高亮(用于当前所在栏目加背景图片或颜色)

    5UCMS判断当前栏目高亮标签 比较简单的是频道页(channel.html): 大类代码: <!--menu:{ $row=10 $table=channel }--> <li { ...

  9. 重新嫁接rm命令

    ### 重定义rm命令 #### 定义回收站目录trash_path='~/.trash'# 判断 $trash_path 定义的文件是否存在,如果不存在,那么就创建 $trash_path.if [ ...

  10. pkusc2021游记

    @ 目录 前言 Day 0 Day 1 Day 2 Day 3 前言 到时候APIO的大概也会写在这篇里吧. Day 0 车,公交,飞机,公交,车 坐了半天的交通终于到了,整个人都坐的晕乎乎的,然后看 ...