高并发处理思路与手段:应用限流

shamo89 shamo89     2023-01-26     212

关键词:

限流就是通过对并发访问/请求进行限速或一个时间窗口内的请求进行限速,从而达到保护系统的目的。一般系统可以通过压测来预估能处理的峰值,一旦达到设定的峰值阀值,则可以拒绝服务(定向错误页或告知资源没有了)排队或等待(例如:秒杀、评论、下单)降级(返回默认数据)。

限流不能乱用,否则正常流量会出现一些奇怪的问题,从而导致用户抱怨。

技术分享图片

 

假设有130W到140W的数据插入到数据库中,如果没有做限流,数据库的主库会突然接收到130w的插入操作。

首先是网络上的开销,很可能直接把带宽占满,导致其他请求无法正常传输和处理,其次会是数据库的负载突然增高,导致无法处理某些数据库的操作,也有可能数据库没有足够的连接导致某些数据库插入查询失败;

还有一点就是现在数据库都做了主从设计,主数据库的数据还要同步给从库,这时瞬间插入了大量的数据,会带来从库和主库的延迟特别大,这时从库查询不准确的概率也会跟着提升。

如果我们放慢插入数据库的速度,这时插入数据库主库的速率会很正常,同步到从库也很正常。网络消耗也可以接收不会影响其他服务。

技术分享图片

 1.计数器法

有时我们还会使用计数器来进行限流,主要用来限制一定时间内的总并发数,比如数据库连接池、线程池、秒杀的并发数;计数器限流只要一定时间内的总请求数超过设定的阀值则进行限流,是一种简单粗暴的总数量限流,而不是平均速率限流。

技术分享图片

这个方法有一个致命问题:临界问题——当遇到恶意请求,在0:59时,瞬间请求100次,并且在1:00请求100次,那么这个用户在1秒内请求了200次,用户可以在重置节点突发请求,而瞬间超过我们设置的速率限制,用户可能通过算法漏洞击垮我们的应用。

技术分享图片

2.滑动窗口算法

技术分享图片

 在上图中,整个红色矩形框是一个时间窗口,在我们的例子中,一个时间窗口就是1分钟,然后我们将时间窗口进行划分,如上图我们把滑动窗口

划分为6格,所以每一格代表10秒,每超过10秒,我们的时间窗口就会向右滑动一格,每一格都有自己独立的计数器,例如:一个请求在0:35到达,

那么0:30到0:39的计数器会+1,那么滑动窗口是怎么解决临界点的问题呢?如上图,0:59到达的100个请求会在灰色区域格子中,而1:00到达的请求

会在红色格子中,窗口会向右滑动一格,那么此时间窗口内的总请求数共200个,超过了限定的100,所以此时能够检测出来触发了限流。

回头看看计数器算法,会发现,其实计数器算法就是窗口滑动算法,只不过计数器算法没有对时间窗口进行划分,所以是一格。

由此可见,当滑动窗口的格子划分越多,限流的统计就会越精确。

 

3.漏铜算法

技术分享图片

这个算法很简单。首先,我们有一个固定容量的桶,有水进来,也有水出去。对于流进来的水,我们无法预计共有多少水流进来,也无法预计流水速度,但

对于流出去的水来说,这个桶可以固定水流的速率,而且当桶满的时候,多余的水会溢出来。

 

4.令牌桶算法

技术分享图片

从上图中可以看出,令牌算法有点复杂,桶里存放着令牌token。桶一开始是空的,token以固定的速率r往桶里面填充,直到达到桶的容量,多余的token会

被丢弃。每当一个请求过来时,就会尝试着移除一个token,如果没有token,请求无法通过。

高并发处理思路与手段:缓存

...,用户数和访问量越来越大,我们的应用需要支撑更多的并发量,同时,我们的应用服务器和数据库服务器所做的计算也 查看详情

高并发处理思路与手段:消息队列

一、消息队列在实际场景中的使用  流程A在处理时没有在当前线程同步的处理完而是直接发送了一条消息A1到队列里,然后消息队列过了一段时间(可能是几毫秒几秒几分钟)这个消息开始被处理,消息处理的过程就相当于流... 查看详情

高并发处理思路与手段:扩容

当一个开发人员提升计算机系统负荷时,通常会考虑两种方式垂直扩展和水平扩展。选用哪种策略主要依赖于要解决的问题以及系统资源的限制。在这篇文章中我们将讲述这两种策略并讨论每种策越的优缺点。如果你已经有一个... 查看详情

springboot-优雅的实现流控

...搞AOP用上验证源码概述限流简言之就是当请求达到一定的并发数或速率,就对服务进行等待、排队、降级、拒绝服务等操作。限流算法我们先简单捋一捋限流算法并发编程-25高并发处理手段之消息队列思路+应用拆分思路&#... 查看详情

高并发处理

高并发处理目录何谓高并发...1从服务端视角看高并发...1高并发带来的问题...2高并发问题的层面...2高并发处理的基本思路...2高并发处理的基本手段...3是手段而非具体的方案...3客户端发出请求层面,常见的手段有:...3前端接收... 查看详情

高并发场景下的限流策略(代码片段)

高并发场景下的限流策略:  在开发高并发系统时,有很多手段来保护系统:缓存、降级、限流。  当访问量快速增长、服务可能会出现一些问题(响应超时),或者会存在非核心服务影响到核心流程的性能时,仍然需要保... 查看详情

聊聊高并发系统之限流特技(代码片段)

  在开发高并发系统时,有很多手段用来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统处理能力,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉... 查看详情

并发与高并发(二十)高并发の应用拆分思路

前言这一章节我们将讲解高并发解决方案中的应用拆分思路,也可以称之为系统拆分。单个服务器再优化,它的处理都是有上限的,因此我们采用扩容、缓存、消息队列等对程序进行优化,这些手段都可行,但还不是全部。随着... 查看详情

高并发限流策略

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,... 查看详情

高并发系统之限流特技

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,... 查看详情

聊聊高并发系统之限流特技-1开涛

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,... 查看详情

nginx浅析4-限流(秒杀,高并发)(代码片段)

...间内用户访问服务器的次数限流方式:控制速率控制并发连接数限流控制速率算法:令牌桶算法漏桶算法1.令牌桶算法 算法思路: 令牌以固定速率产生,放到令牌桶中令牌桶放满时,多余令牌丢弃请求要在桶中拿... 查看详情

java并发编程与高并发解决方案

下载地址:百度网盘下载课程简介:【并发编程与高并发难题我们一起攻克】本课程将结合大量图示及代码演示,让你更容易,更系统的掌握多线程并发编程(线程安全,线程调度,线程封闭,同步容器等)与高并发处理思路与... 查看详情

java并发编程-应用限流及其常见算法

应用限流在开发高并发系统时,有三把利器用来保护系统:缓存、降级和限流:缓存:缓存的目的是提升系统访问速度和增大系统处理容量降级:降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题... 查看详情

高并发场景下的限流策略

高并发场景下的限流策略在高并发的场景下,我们的优化和保护系统的方式通常有:多级缓存、资源隔离、熔断降级、限流等等。今天我们来聊聊限流。为什么需要限流举个比较简单的例子,正常来说,一个员工A他每天能够处... 查看详情

高并发处理中缓存降级限流技术

缓存技术  浏览器缓存是指当我们使用浏览器访问一些网站页面或者http服务时,根据服务端返回的缓存设置响应头将响应内容缓存到浏览器,下次可以直接使用缓存内容或者仅需要去服务端验证内容是否过期即可。这样... 查看详情

springboot接口-如何实现接口限流之单实例(代码片段)

...示例源码#准备知识点主要的知识点,请参考架构之高并发:限流,这里小结下。#为什么要限流每个系统都有服务的上线,所以当流量超过服务极限能力时,系统可能会出现卡死、崩溃的情况,所以就有了降级... 查看详情

高并发场景以及应对技巧(代码片段)

文章目录高并发现实生活中的场景1高并发基础1.1并发与并行1.2什么是高并发1.3从服务端视角看高并发1.4高并发带来的问题1.5高并发问题层面2.高并发应对技巧2.1应对思路2.1.1客户端2.1.2服务端2.1.3服务端处理基本原则2.2应对手段2.2... 查看详情