当前位置:首页 > 服务端 > 面试被问高并发流量控制,我脸都绿了。。。

面试被问高并发流量控制,我脸都绿了。。。

2022年11月05日 22:59:06服务端10

原文链接:http://www.iocoder.cn/zhishixingqiu/?vip\x26amp;amp;amp;mp

收起

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 8:55 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:jianshu.com/p/d9504fc0af4d

  • 前言

  • 应对大流量的一些思路

  • 限流的常用方式

  • 限流神器:Guava RateLimiter

  • 分布式场景下的限流


前言

在实际项目中,曾经遭遇过线上5W+QPS的峰值,也在压测状态下经历过10W+QPS的大流量请求,本篇博客的话题主要就是自己对高并发流量控制的一点思考。

应对大流量的一些思路

首先,我们来说一下什么是大流量?

大流量,我们很可能会冒出:TPS(每秒事务量),QPS(每秒请求量),1W+,5W+,10W+,100W+...。其实并没有一个绝对的数字,如果这个量造成了系统的压力,影响了系统的性能,那么这个量就可以称之为大流量了。

其次,应对大流量的一些常见手段是什么?

缓存:说白了,就是让数据尽早进入缓存,离程序近一点,不要大量频繁的访问DB。

降级:如果不是核心链路,那么就把这个服务降级掉。打个比喻,现在的APP都讲究千人千面,拿到数据后,做个性化排序展示,如果在大流量下,这个排序就可以降级掉!

限流:大家都知道,北京地铁早高峰,地铁站都会做一件事情,就是限流了!想法很直接,就是想在一定时间内把请求限制在一定范围内,保证系统不被冲垮,同时尽可能提升系统的吞吐量。

注意到,有些时候,缓存和降级是解决不了问题的,比如,电商的双十一,用户的购买,下单等行为,是涉及到大量写操作,而且是核心链路,无法降级的,这个时候,限流就比较重要了。

那么接下来,我们重点说一下,限流。

限流的常用方式

限流的常用处理手段有:计数器、滑动窗口、漏桶、令牌。

计数器

计数器是一种比较简单的限流算法,用途比较广泛,在接口层面,很多地方使用这种方式限流。在一段时间内,进行计数,与阀值进行比较,到了时间临界点,将计数器清0。

面试被问高并发流量控制,我脸都绿了。。。 _ JavaClub全栈架构师技术笔记

计数器思想

代码实例

面试被问高并发流量控制,我脸都绿了。。。 _ JavaClub全栈架构师技术笔记 计数器代码实现

这里需要注意的是,存在一个时间临界点的问题。举个栗子,在12:01:00到12:01:58这段时间内没有用户请求,然后在12:01:59这一瞬时发出100个请求,OK,然后在12:02:00这一瞬时又发出了100个请求。这里你应该能感受到,在这个临界点可能会承受恶意用户的大量请求,甚至超出系统预期的承受。

滑动窗口

**由于计数器存在临界点缺陷,后来出现了滑动窗口算法来解决。

**

面试被问高并发流量控制,我脸都绿了。。。 _ JavaClub全栈架构师技术笔记 滑动窗口原理图

滑动窗口的意思是说把固定时间片,进行划分,并且随着时间的流逝,进行移动,这样就巧妙的避开了计数器的临界点问题。也就是说这些固定数量的可以移动的格子,将会进行计数判断阀值,因此格子的数量影响着滑动窗口算法的精度。

漏桶

虽然滑动窗口有效避免了时间临界点的问题,但是依然有时间片的概念,而漏桶算法在这方面比滑动窗口而言,更加先进。

有一个固定的桶,进水的速率是不确定的,但是出水的速率是恒定的,当水满的时候是会溢出的。

面试被问高并发流量控制,我脸都绿了。。。 _ JavaClub全栈架构师技术笔记 漏桶算法思想

代码实现

面试被问高并发流量控制,我脸都绿了。。。 _ JavaClub全栈架构师技术笔记 漏桶代码实现

令牌桶

注意到,漏桶的出水速度是恒定的,那么意味着如果瞬时大流量的话,将有大部分请求被丢弃掉(也就是所谓的溢出)。为了解决这个问题,令牌桶进行了算法改进。

面试被问高并发流量控制,我脸都绿了。。。 _ JavaClub全栈架构师技术笔记 令牌桶原理

生成令牌的速度是恒定的,而请求去拿令牌是没有速度限制的。这意味,面对瞬时大流量,该算法可以在短时间内请求拿到大量令牌,而且拿令牌的过程并不是消耗很大的事情。(有一点生产令牌,消费令牌的意味)

不论是对于令牌桶拿不到令牌被拒绝,还是漏桶的水满了溢出,都是为了保证大部分流量的正常使用,而牺牲掉了少部分流量,这是合理的,如果因为极少部分流量需要保证的话,那么就可能导致系统达到极限而挂掉,得不偿失。

代码实现

面试被问高并发流量控制,我脸都绿了。。。 _ JavaClub全栈架构师技术笔记 令牌桶代码实现

限流神器:Guava RateLimiter

Guava不仅仅在集合、缓存、异步回调等方面功能强大(可以参考博主的《使用Google Guava快乐编程》),而且还给我们封装好了限流的API!

Guava RateLimiter基于令牌桶算法,我们只需要告诉RateLimiter系统限制的QPS是多少,那么RateLimiter将以这个速度往桶里面放入令牌,然后请求的时候,通过tryAcquire()方法向RateLimiter获取许可(令牌)。

代码示例

面试被问高并发流量控制,我脸都绿了。。。 _ JavaClub全栈架构师技术笔记 RateLimiter

分布式场景下的限流

上面所说的限流的一些方式,都是针对单机而言的,其实大部分的场景,单机的限流已经足够了。分布式下限流的手段常常需要多种技术相结合,比如Nginx+Lua,Redis+Lua等去做。本文主要讨论的是单机的限流,这里就不在详细介绍分布式场景下的限流了。

一句话,让系统的流量,先到队列中排队、限流,不要让流量直接打到系统上。

好了,到这里,本文就结束了!

早安!

美好的一天开始了,上班咯!



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

面试被问高并发流量控制,我脸都绿了。。。 _ JavaClub全栈架构师技术笔记

已在知识星球更新源码解析如下:

面试被问高并发流量控制,我脸都绿了。。。 _ JavaClub全栈架构师技术笔记

面试被问高并发流量控制,我脸都绿了。。。 _ JavaClub全栈架构师技术笔记

面试被问高并发流量控制,我脸都绿了。。。 _ JavaClub全栈架构师技术笔记

面试被问高并发流量控制,我脸都绿了。。。 _ JavaClub全栈架构师技术笔记

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

兄弟,一口,点个!????

作者:披风秃头侠
来源链接:https://blog.csdn.net/qq_41371349/article/details/108018010

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/68063.html

标签: 高并发面试
分享给朋友:

“面试被问高并发流量控制,我脸都绿了。。。” 的相关文章

并发编程|说完AQS,面试官为何不淡定了?

并发编程|说完AQS,面试官为何不淡定了?

你能说下什么是AQS AQS是队列同步器AbstractQueueSynchronizer的简写,它是用来构建锁和其他同步组件的基础框架,它定义了一个全局的int 型的state变量,通过内置的FIFO(先进先出)队列来完成资源竞...

java基础面试题:运行时异常与一般异常有何异同?error和exception有什么区别? 请写出你最常见到的5个runtimeexception?

Throwable是Java错误处理的父类,有两个子类:Error和Exception。   Error:无法预期的严重错误,导致JVM虚拟机无法继续执行,几乎无法恢复捕捉的 Exception:可恢复捕捉的。java健壮程序的手段。  ...

近期安卓与IOS招聘面试有感

版权声明:本文出自汪磊的博客,转载请务必注明出处。 一、你总是想一步登天,却不知道路是一步步走出来的 大概是放年假前一个月开始招聘吧,陆陆续续到目前为止安卓面试10几个,IOS面试了15个左右,本以为很好招聘的,没想到没有一个合适的,要求本不高只想基础扎实一些,但是就这一条...

SpringBoot面试题及答案140道(2021年最新)

工作5年,处于找工作中ing。今年10月份刚刚整理出来的SpringBoot面试题,时间比较赶就没有按照模块分类排序了。总而言之,顺序比较乱,希望大家耐着性子 看。如果实在介意,评论告知,我会视情况作修改的。另外如果大家觉得我找的SpringBoot面试题答案不够清晰,欢迎私信或...

Spring Boot面试题汇总,含答案

Spring Boot面试题汇总,含答案

1 什么是springboot ? 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件) 创建独立的spring引用程序 main方法运行  嵌入的Tomcat 无需部署war文件&nb...

GO面试题第二天

1.下面两段代码输出什么。 // 1. func main() { s := make([]int, 5) s = append(s, 1, 2, 3) fmt.Println(s) } // 2. func main() {...

在线练习题库python

10个锻炼编程技能的网站,拿走不谢! 一、LeetCode(有中文) 力扣(LeetCode)源自美国硅谷,是领扣网络旗下专注于程序员技术成长和企业技术人才服务的品牌。已经成为程序员找工作前必刷的网址之一了。 在刷leetcode之前可以看下这个...

Java高级面试题整理(附答案)

这是我收集的10道高级Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战你的 Java 知识,但这些问题都是容易在各种 Java 面试中被问到...

go面试题[3]

第一题 1.下面的两个切片声明中有什么区别?哪个更可取? A. var a []int B. a := []int{} 参考答案及解析:A 声明的是 nil 切片;B 声明的是长度和容量都为 0 的空切片。第一种切片声明不会分配内存,优先选择。 2. A、B、C...

杭州银行面试题整理

如何遍历map spring ioc和aop理解 autowired和resource注解的区别 list和set区别 arraylist和linkedlist区别 文件上传 数据库显示成绩前五名的学生...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。