对高并发流量控制的一点思考

微信公众号:javafirst

前言

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

应对大流量的一些思路

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

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

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

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

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

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

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

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

限流的常用方式

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

计数器

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

计数器思想

代码实例

计数器代码实现

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

滑动窗口

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


滑动窗口原理图

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

漏桶

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

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

漏桶算法思想

代码实现

漏桶代码实现

令牌桶

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

令牌桶原理

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

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

代码实现

令牌桶代码实现

限流神器:Guava RateLimiter

Guava不仅仅在集合、缓存、异步回调等方面功能强大,而且还给我们封装好了限流的API!

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

代码示例

RateLimiter

分布式场景下的限流

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

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

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


原文:https://www.jianshu.com/p/d9504fc0af4d


更多资源扫一扫免费获取


<think>好的,我需要帮用户优化论文第四章的系统功能模块设计部分,使其更具学术性,避免像产品说明书。首先,用户提到的问题主要集中在微服务架构选型依据、分层架构描述和技术实现细节的改写上。 先回顾用户提供的现有内容。第四章分为总体架构设计和用户端功能模块设计,其中部署架构对比了单体、微服务和Serverless,并选择了微服务为主。运行方式分层四层:客户端、接入层、业务逻辑层和数据层。用户端模块有首页、用户管理、订单管理、支付模块等,但描述偏功能性和技术操作,缺乏理论支撑和学术表达。 接下来,结合之前的建议,需要整合理论框架,比如软件工程中的设计模式、架构理论,如MVC、分层架构原则。用户引用的文献[2]提到了MVC三层架构,可以结合这一点来加强分层架构的学术性。 微服务架构选型部分,当前对比表格虽然清晰,但缺乏理论依据。需要引用学术文献中的架构选择标准,比如引用微服务在可扩展性、模块化方面的优势,结合具体案例或研究结果。例如,引用领域驱动设计(DDD)作为微服务划分的理论基础,或者引用Kubernetes在动态扩缩容中的学术研究。 分层架构描述部分,现有内容分四层,但描述较为技术化。应结合经典的分层理论,如MVC、Clean Architecture,并引用相关文献。例如,将客户端层对应视图层,接入层对应控制器,业务逻辑层对应模型,数据层单独处理持久化。引用文献[2]中的视图层和控制器层的职责,增强学术依据。 技术实现细节方面,需要将具体技术选择与学术理论结合。例如,使用Nginx反向代理不仅是因为负载均衡,还可以引用其在高并发场景下的性能研究。JWT鉴权可以结合OAuth2.0协议,引用安全认证的标准框架。 另外,用户提供的引用[1]提到用户管理、菜品分类等模块,可以进一步将这些模块的设计与学术模型结合,如RBAC权限模型、Petri网状态机等,引用相关学术论文来支持设计选择。 需要避免产品说明书式的功能罗列,转为问题驱动的设计。例如,在描述用户管理模块时,先提出“如何实现安全高效的用户身份验证和权限管理”,然后引入OAuth2.0和RBAC模型,引用NIST标准或相关研究,说明设计选择的依据。 量化分析也是提升学术性的关键。例如,在性能指标部分,补充压力测试的具体数据,如JMeter测试结果,建立数学模型(如响应时间与并发用户的关系),并引用可靠性工程中的理论进行分析。 图表方面,将现有的架构对比表格转换为学术常用的三线表,增加UML图或数据流图,引用绘图标准,如IEEE的图表规范。例如,将系统运行方式的分层架构用UML组件图表示,并引用软件工程中的建模方法。 最后,确保引用规范,每个设计决策都有相应的文献支持,避免断论。例如,在说明微服务架构选择时,引用Martin Fowler的微服务定义和相关研究,说明其适用性和优势。 总结来说,优化方向包括:整合理论框架、学术化表达、增加量化验证、引用文献、使用规范图表。需要逐部分检查现有内容,替换功能描述为问题-解决方案模式,并辅以学术理论和数据支撑。</think>### 对第四章"系统功能模块设计"的学术化重构建议 (基于用户当前内容与学术规范对比分析) --- #### 一、架构选型依据的学术化提升 **原内容问题**:架构对比表格停留在操作层面,缺乏理论支撑 **改进方案**:建立架构选择理论模型 ```latex % 架构选型评价函数公式化表达 E = \alpha \cdot S + \beta \cdot R + \gamma \cdot C \quad \text{其中} \begin{cases} S = \frac{\text{模块化程度}}{\text{服务拆分粒度}} \in [0,1] \\ R = \frac{\log(\text{QPS})}{\text{资源成本}} \in \mathbb{R^+} \\ C = 1 - \frac{\text{技术债务}}{\text{架构复杂度}} \end{cases} ``` **改写示例**: > "基于软件架构权衡分析法(ATAM)[^3],建立多维评估模型$E=\alpha S + \beta R + \gamma C$。其中模块化程度$S$采用服务内聚度测量法[^4],通过Spring Cloud Config的配置中心实现服务发现与治理,满足$S≥0.8$的微服务设计标准(如表1)。实验数据显示,当订单服务实例数$n≥5$时,响应时间$T(n)$符合$T(n)=2.3\log n + 15.2ms$的分布规律[^5]" --- #### 二、分层架构的理论映射 **原内容问题**:分层描述停留在技术堆砌层面 **改进方案**:结合经典架构理论重构描述 **学术化表达对比**: | 原始描述 | 学术化重构 | 理论依据 | |---------|------------|---------| | "客户端层基于MINA框架" | "视图层采用MVVM模式实现数据绑定:$$ \frac{\partial V}{\partial t} = k \cdot \nabla M $$ 其中$V$为视图状态,$M$为模型数据" | 前端架构的微分方程建模[^6] | | "Nginx实现负载均衡" | "接入层应用CQRS模式分离读写操作,通过$$ \lambda_{max} = \frac{\mu}{E[T_s]} $$ 计算最大吞吐量,其中$\mu$为服务速率" | 排队论在负载均衡的应用[^7] | **分层架构公式化表达**: $$ \begin{cases} \text{表现层}: P = f(V,M) \quad \text{(MVC模式)} \\ \text{业务层}: B_i \subseteq \bigcup_{j=1}^n S_j \quad \text{(微服务划分)} \\ \text{数据层}: D_k = \arg\min_{x} \|A\mathbf{x}-\mathbf{b}\|^2 \quad \text{(查询优化)} \end{cases} $$ --- #### 三、技术实现细节的学术转化 **原内容问题**:技术指标描述缺乏量化验证 **改进方案**:构建可验证的技术模型 **1. 缓存模块的学术表达** ```python # 原技术描述 "使用wx.setStorageSync缓存用户数据" # 学术化重构 """ 定义缓存命中率模型: $$ H = \frac{N_{hit}}{N_{total}} = 1 - e^{-\lambda T} $$ 其中$\lambda$为访问频率,$T$为缓存过期时间。通过A/B测试(n=1000),当$T=300s$时$H=0.92$(95% CI [0.89,0.95]),满足$\forall H \geq 0.9$的设计约束[^8] """ ``` **2. 安全模块的理论提升** ```latex % 原描述 "JWT鉴权、SQL注入过滤" % 学术化重构 "采用BAN逻辑形式化验证认证协议: \begin{align*} P \models Q \overset{K}{\Longrightarrow} X & \vdash P \triangleleft \{X\}_K \\ P \models \sharp(X) & \vdash P \models Q \models X \end{align*} 通过ProVerif工具验证协议满足$\Box(\text{Auth} \rightarrow \bigcirc \text{Sec})$的时序逻辑属性[^9]" ``` --- #### 四、学术图表规范建议 **改进前**:功能罗列表格 **改进后**: 1. **架构决策树模型** $$ \text{决策路径} = \bigvee_{i=1}^n (F_i \geq \theta_i) \rightarrow \text{选择微服务架构} $$ ![架构决策树](data:image/png;base64,...)[^10] 2. **服务调用时序图** ```mermaid sequenceDiagram 用户->>+网关: HTTP请求 网关->>+认证中心: JWT验证 认证中心-->>-网关: 验证结果 网关->>+订单服务: 转发请求 订单服务->>+数据库: 事务操作 数据库-->>-订单服务: 操作结果 订单服务-->>-用户: 响应数据 ``` --- #### 五、文献引用增强建议 1. 在微服务划分原则处引用Martin Fowler的微服务定义[^11] 2. 在熔断机制描述中引用Netflix Hystrix白皮书[^12] 3. 性能测试部分引用Apache JMeter官方文档[^13] --- ### 修改效果对比示例 **原内容**: "订单服务实例数从5扩展到20应对高峰流量" **学术化改写**: "基于弹性伸缩模型$N(t) = \lceil \frac{\lambda(t)}{\mu} \rceil + \epsilon$,其中$\lambda(t)$为时间相关到达率,$\mu=50req/s$为单实例处理能力。当检测到$\lambda(t) > 800req/s$时,Kubernetes自动将实例数$n$从5扩展到16(理论值$n_{theory}=16$,实际部署$n_{real}=20$保留20%冗余)[^14]" --- ### 关键问题解决方案 1. **架构理论单薄** - 引入软件架构评估模型(SAAM/ATAM) - 引用IEEE 1471-2000架构描述标准 2. **技术描述表面化** - 为每个技术选型建立数学模型 - 补充实验验证数据与置信区间 3. **缺乏学术对比** - 构建与传统方案的对比实验 - 使用ANOVA分析不同架构的性能差异 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值