大家好,架构摆渡人。这是我的第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%即可。

热门内容:
  • 八股文!让我收获了诸多offer~

  • 杭州程序员从互联网跳央企,晒一天工作和收入,网友:待一年就废

  • 别人家的公司的 1024 程序员节 ! 羡慕了!

  • 学废了!面试官常问的14个......

  • 抖音的服务器究竟有多大?

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

流量治理神器-Sentinel的限流模式,选单机还是集群?相关推荐

  1. 流量治理神器 Sentinel的限流模式

    参考:https://mp.weixin.qq.com/s/K_qPbqIsYYNzuhYxJBYV2A

  2. 如何使用Sentinel做流量控制?此文将附代码详细介绍Sentinel几种限流模式

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习.本篇文章将详细介绍Sentinel的两种限流模式,由于篇幅原因,后续文章将详细介绍Sentinel的其他三种. 如果文章有什么需要改进的地方 ...

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

    文章目录如下: 网关如何限流? Spring Cloud Gateway本身自带的限流实现,过滤器是RequestRateLimiterGatewayFilterFactory,不过这种上不了台面的就 ...

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

    前一篇文章介绍了Spring Cloud Gateway的一些基础知识点,今天陈某就来唠一唠网关层面如何做限流? 文章目录如下: 网关如何限流? Spring Cloud Gateway本身自带的限流 ...

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

    转载 https://www.cnblogs.com/smallSevens/p/11531534.html 前言 在从0到1构建分布式秒杀系统和打造十万博文系统中,限流是不可缺少的一个环节,在系统能 ...

  6. Sentinel实现限流熔断及与Spring Cloud整合

    why 在分布式中,为了保证服务高可用,就必须对请求进行限流或服务降级的方式才能够保证不会被流量拖垮导致雪崩效应, what–什么是sentinel? 它是面向分布式服务架构的轻量级流量控制组件,主要 ...

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

    Spring Cloud Alibaba | Sentinel: 服务限流高级篇 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明 ...

  8. Spring Cloud Alibaba实战(三) - Sentinel之限流

    目录 (一)Nacos动态配置 (二)Nacos注册中心 (三)Sentinel之限流 (四)Sentinel之熔断 (五)Gateway之路由.限流 (六)Gateway之鉴权.日志 (七)Gate ...

  9. sentinel 热点限流

    sentinel 热点限流 官网:https://sentinelguard.io/zh-cn/docs/parameter-flow-control.html 热点限流 sentinel使用lru算 ...

最新文章

  1. 互联网技术的技术名词
  2. 第二章-大数据处理框Hadoop
  3. KDD 2021 | 小红书推荐多样性解决方案:SSD在质量、多样性之间获得较好权衡
  4. ubuntu18.10安装octave
  5. Python-接口开发入门
  6. 靶形数独(信息学奥赛一本通-T1447)
  7. WinDriver Kernel Plugin开发
  8. 3.25期货每日早盘操作建议
  9. 制定自己的工作目标时,应该学会SMART法则
  10. 大学生python作业代做_代写COMP9021作业、代做Python编程语言作业、代写Python实验作业、代做program留学生作业...
  11. Codeforces Round #609 (Div. 2) C. Long Beautiful Integer
  12. Unity3D 对于在VR中普通摄像头和VR摄像头同时存在——分屏
  13. win7系统ntp时间服务器,win7与内部ntp服务器同步时间出来错误【NTP时间同步服务器】...
  14. zuul : Forwarding error 全局异常处理
  15. Codecademy网学习Python第七天
  16. AfterNodeInsertion方法
  17. cmd chcp命令切换字符格式
  18. CPU性能测试工具-Linpack
  19. Opencv中flip函数讲解
  20. java无参构造赋值怎么没用_Java有参构造方法和无参构造方法详解

热门文章

  1. 多角度解析自动驾驶芯片
  2. 《数据科学家养成手册》--第十一章算法学2---(非监督,监督贝叶斯概率以及损失函数)
  3. 如何在调试页面的时候清除页面的缓存?
  4. NOIP模拟题 斐波那契数列
  5. Android修改包名
  6. 编程之法----面试和算法心得
  7. javascript eval和JSON之间的联系
  8. 【Codeforces】1080C Masha and two friends (棋盘染色)
  9. 【Codeforces】1111B - Average Superhero Gang Power
  10. KNN 分类算法原理代码解析