流量治理神器-Sentinel的限流模式,选单机还是集群?
大家好,架构摆渡人。这是我的第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的限流模式,选单机还是集群?的更多相关文章
- 流量治理神器-Sentinel 究竟是怎么做到让业务方接入简单?
大家好,我是架构摆渡人,这是流量治理系列的第10篇原创文章,如果有收获,还请分享给更多的朋友. 做业务开发,需要考虑业务的扩展性.做基础框架开发,需要考虑如何让业务方接入,使用简单,尽量不要耦合在业务 ...
- Spark运行模式_本地伪集群运行模式(单机模拟集群)
这种运行模式,和Local[N]很像,不同的是,它会在单机启动多个进程来模拟集群下的分布式场景,而不像Local[N]这种多个线程只能在一个进程下委屈求全的共享资源.通常也是用来验证开发出来的应用程序 ...
- Spring Cloud Gateway 整合阿里 Sentinel网关限流实战!
大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第八篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...
- Spring Cloud Alibaba | Sentinel: 服务限流基础篇
目录 Spring Cloud Alibaba | Sentinel: 服务限流基础篇 1. 简介 2. 定义资源 2.1 主流框架的默认适配 2.2 抛出异常的方式定义资源 2.3 返回布尔值方式定 ...
- Spring Cloud Alibaba | Sentinel: 服务限流高级篇
目录 Spring Cloud Alibaba | Sentinel: 服务限流高级篇 1. 熔断降级 1.1 降级策略 2. 热点参数限流 2.1 项目依赖 2.2 热点参数规则 3. 系统自适应限 ...
- SpringBoot 2.0 + 阿里巴巴 Sentinel 动态限流实战
前言 在从0到1构建分布式秒杀系统和打造十万博文系统中,限流是不可缺少的一个环节,在系统能承受的范围内既能减少资源开销又能防御恶意攻击. 在前面的文章中,我们使用了开源工具包 Guava 提供的限流工 ...
- Spring Cloud微服务Sentinel+Apollo限流、熔断实战总结
在Spring Cloud微服务体系中,由于限流熔断组件Hystrix开源版本不在维护,因此国内不少有类似需求的公司已经将眼光转向阿里开源的Sentinel框架.而以下要介绍的正是作者最近两个月的真实 ...
- Greenplum源码编译安装(单机及集群模式)完全攻略
公司有个项目需要安装greenplum数据库,让我这个gp小白很是受伤,在网上各种搜,结果找到的都是TMD坑货帖子,但是经过4日苦战,总算是把greenplum的安装弄了个明白,单机及集群模式都部署成 ...
- Scala进阶之路-Spark独立模式(Standalone)集群部署
Scala进阶之路-Spark独立模式(Standalone)集群部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们知道Hadoop解决了大数据的存储和计算,存储使用HDFS ...
随机推荐
- Dubbo | Dubbo快速上手笔记 - 环境与配置
目录 前言 1. Dubbo相关概念 1.1 自动服务发现工作原理 2. 启动文件 2.1 zookeeper-3.4.11\bin\zkServer.cmd 2.2 zookeeper-3.4.11 ...
- Python3-sqlalchemy-orm
1 #-*-coding:utf-8-*- 2 #__author__ = "logan.xu" 3 4 5 import sqlalchemy 6 from sqlalchemy ...
- 剑指offer计划5(查找算法中等版)---java
1.1.题目1 剑指 Offer 04. 二维数组中的查找 1.2.解法 其实就是暴力解法的升级版,从最后一行开始判断,通过num当前的大小, 如果还是大于目标值则行数-1,若是小于则列数+1 1.3 ...
- vue 引用高德地图
vue 引用地图之傻瓜式教程(复制粘贴即可用) npm 下载 npm install vue-amap --save main.js 代码 import AMap from 'vue-amap'; V ...
- spring boot 系列之八:SpringBoot处理定时任务
项目经常会用到定时任务,springboot自然是可以通过整合相关组件来实现的. 目前常用的定时任务的实现有两种: 通过spring 自带的定时器任务@Schedule来实现 通过Quartz来实现 ...
- TCP协议中的TIME_WAIT详细说明
文章目录 4.3设置TIME_WAIT状态的目的 4.3.1 实现TCP全双工连接的关闭 4.3.2 使过时的重复报文段失效 4.3.3 TIME_WAIT状态的自结束 4.3.4 TIME_WAIT ...
- word域实现动态填充信息附件下载
1.问题描述:在页面上一些下载附件功能,点击触发执行下载操作时候,有些电脑的浏览器可以,有些电脑的浏览器下载不了,电脑打开弹出的下载框下载的不是一个文件,而是一个如jspx后缀名的页面,jspx后缀是 ...
- python中字符串的各种方法
图片来源见水印,一个学python的公众号
- 关于AS下Gradle安装问题总结
在之前安装AS的随笔中简单描述了解决方法,但不够详细,在第二次创建项目时又遇到了gradle安装错误,通过在网上查找解决方法,发现方法比较多样,且描述不够仔细,本随笔将详细记录我在gradle安装中的 ...
- Linux系列(7) - 链接命令
硬链接 拥有相同的i节点和存储block块,可以看做事同一个文件 可通过i节点识别 不能跨分区 不能针对目录使用,只能针对文件 软链接 类似Windows快捷方式 软链接拥有自己的i节点和block块 ...