0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

海量请求下的接口并发解决方案

jf_ro2CN3Fa 来源:CSDN技术社区 作者:舍其小伙伴 2022-12-14 13:48 次阅读

设定一个场景,假如一个商品接口在某段时间突然上升,会怎么办?

生活中的例子来说,假设冰墩墩在当天晚上上热搜之后,迅速有十几万人去淘宝下单购买,此时并没有做好对该商品的缓存预热以及准备,如何操作?

对于这个问题,在电商高并发系统中,对接口的保护一般采用:缓存、限流、降级 来操作。

假设该接口已经接受过风控的处理,过滤掉一半的机器人脚本请求,剩下都是人为的下单请求。

服务限流

限流 主要的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。

限流算法

1. 漏斗算法

漏桶算法 是当请求到达时直接放入漏桶,如果当前容量已达到上限(限流值),则进行丢弃或其他策略(触发限流策略)。漏桶以固定的速率(根据服务吞吐量)进行释放访问请求(即请求通过),直到漏桶为空。

漏斗算法的思想就是,不管你来多少请求,我的接口消费速度一定是小于等于流出速率的阈值的。

4e5dc4f0-7b61-11ed-8abf-dac502259ad0.png

可以基于消息队列来实现。

2. 令牌桶算法

令牌桶算法 是程序以v(v = 时间周期 / 限流值)的速度向令牌桶中增加令牌,直到令牌桶满,请求到达时向令牌桶请求令牌,如果获取成功则通过请求,如果获取失败触发限流策略。

令牌桶算法和漏斗算法的思想差别在于,前者可以允许突发请求的发生。

4e6ecaa2-7b61-11ed-8abf-dac502259ad0.png

3. 滑窗算法

滑窗算法 是将一个时间周期分为N个小周期,分别记录每个小周期内访问次数,并且根据时间滑动删除过期的小周期。

如下图所示,假设时间周期为1分钟,将1分钟再分为2个小周期,统计每个小周期的访问数量,则可以看到,第一个时间周期内,访问数量为75,第二个时间周期内,访问数量为100,如果一个时间周期内所有的小周期总和超过100的话,则会触发限流策略。

4e89500c-7b61-11ed-8abf-dac502259ad0.png

Sentinel的实现 和 TCP滑窗。

接入层限流

Nginx限流

Nginx 限流采用的是漏桶算法。

它可以根据客户端特征,限制其访问频率,客户端特征主要指 IP、UserAgent等。使用 IP 比 UserAgent 更可靠,因为 IP 无法造假,UserAgent 可随意伪造。

本地接口限流

Semaphore

Java 并发库 的 Semaphore 可以很轻松完成信号量控制,Semaphore 可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

假如我们对外提供一个服务接口,允许最大并发数为40,我们可以这样:

privatefinalSemaphorepermit=newSemaphore(40,true);

publicvoidprocess(){

try{
permit.acquire();
//TODO处理业务逻辑

}catch(InterruptedExceptione){
e.printStackTrace();
}finally{
permit.release();
}
}

具体的 Semaphore 实现参考源码。

分布式接口限流

使用消息队列

不管是用MQ中间件,或是Redis的List实现的消息队列,都可以作为一个 缓冲队列 来使用。思想就是基于漏斗算法。

当对于一个接口请求达到一定阈值时,就可以启用消息队列来进行接口数据的缓冲,并根据服务的吞吐量来消费数据。

4e9bb044-7b61-11ed-8abf-dac502259ad0.png

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

服务降级

在接口做好风控的前提下,发现了接口请求的并发量迅速上升,我们可以启用兜底方案,进行服务降级。

一般服务降级应该用来对一些 不重要 或 不紧急 的服务或任务进行服务的 延迟使用 或 暂停使用。

降级方案

停止边缘业务

比如淘宝双11前,就不可以查询三个月前的订单,对边缘业务进行降级,保证核心业务的高可用。

拒绝请求

在接口请求并发量大于阈值,或是接口出现大量失败请求等等突发情况,可以拒绝一些访问请求。

拒绝策略

随机拒绝:随机拒绝超过阈值的请求 。

拒绝旧请求:按照请求的时间,优先拒绝更早收到的请求。

拒绝非核心请求:根据系统业务设置核心请求清单,将非核心清单内的请求拒绝掉。

恢复方案

在实现服务降级之后,对于突增流量我们可以继续注册多个消费者服务来应对并发量,之后我们再对一些服务器进行慢加载。

降级具体实现参考其他文章。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

数据缓存

在接口做好风控的前提下,发现了接口请求的并发量迅速上升,我们可以分以下几个操作执行:

对访问请求使用分布式锁进行阻塞。

在这个短时间中,我们可以将对应操作行的热点数据,缓存在缓存中间件中。

放行请求后,让所有请求优先操作缓存数据。

再将操作的结果通过消息队列发送给消费接口慢慢消费。

4eac01ce-7b61-11ed-8abf-dac502259ad0.png

缓存问题

假设我们操作的是一个库存接口,此时数据库中只有100个库存。

那假如此时我们将一条数据放入缓存中,如果所有的请求都来访问这个缓存,那它还是被打挂,我们该怎么操作?

读写分离

第一种想法,读写分离。

使用Redis的哨兵集群模式来进行主从复制的读写分离操作。读的操作肯定大于写操作,等库存被消费到0时,读操作直接快速失败。

4ebed39e-7b61-11ed-8abf-dac502259ad0.png

负载均衡

第二种想法,负载均衡。

在缓存数据后,如果所有请求都来缓存中操作这个库存,不管是加悲观锁还是乐观锁,并发率都很低,此时我们可以对这个库存进行拆分。

我们可以参照 ConcurrentHashMap 中的 counterCells 变量的设计思想,将100个库存拆分到10个缓存服务中,每个缓存服务有10个缓存,然后我们再对请求进行负载均衡到各个缓存服务上。

但是这种方式会有问题,如果大部分用户被hash到同一个缓存上,导致其他缓存没有被消费,却返回没有库存,这是不合理的。

4ed5872e-7b61-11ed-8abf-dac502259ad0.png

page cache

第三种想法,page cache。

大部分软件架构其实都用到了这种方法,比如linux内核的硬盘写入、mysql的刷盘等等,即将短时间内的写操作聚合结果写入,所有的写操作在缓存内完成。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8284

    浏览量

    150079
  • 算法
    +关注

    关注

    23

    文章

    4559

    浏览量

    92092

原文标题:海量请求下的接口并发解决方案

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    立体智慧仓储解决方案.#云计算

    解决方案智能设备
    学习电子知识
    发布于 :2022年10月06日 19:45:47

    存储器接口生成器(MIG)解决方案

    存储器接口生成器(MIG)解决方案---Virtex-4 存储器接口和Virtex-II Pro存储器解决方案 Virtex-4? FPGAs solve
    发表于 10-24 12:02

    基于U盘的单片机海量存储方案

    基于U盘的单片机海量存储方案随着Flash Memory非易失存储技术的发展,基于USB接口的闪存即U盘现已得到广泛应用。从理论上讲,以U盘作为便携式采集存储系统的存储载体完全能够满足长时间采集
    发表于 11-30 08:59

    HDMI接口静电保护解决方案

    东沃DOWO技术部门根据客户的需求设计了很多保护方案,接下来重点来分享其中一个HDMI接口的ESD静电保护解决方案方案中用到了两种ESD静电保护二极管物料,分别是:DW03DLC-B
    发表于 12-31 15:57

    怎样使用Redis + LUA脚本进行系统控制并发以防止无效请求

    个以上的请求时,它将提示“对接口进行签名的客户端请求数超过了限制”。然后,作为下游系统,我们需要控制并发以防止无效请求。最常用的
    发表于 03-22 13:45

    P2P流媒体系统中并发请求的数据分发算法

    大规模并发请求是流媒体直播系统面临的一个挑战,也是视频点播系统中亟待解决的一个问题。本文针对相同数据的并发请求问题,提出了一种高效,低带宽消耗、低延迟的数据
    发表于 12-30 14:21 14次下载

    海思参展ICTC 2008并发布双向多功能机顶盒芯片解决方案

    海思参展ICTC 2008并发布双向多功能机顶盒芯片解决方案 在第十六届杭州ICTC 2008展上,海思现场发布并展示了业界最佳性价比全系列机顶盒芯片解决方案,其中包括:双
    发表于 10-30 08:45 461次阅读

    海量小文件存储的问题以及解决方案

    海量小文件是业界难题,甚至有专门的名词,LOSF(lots of samll file)。通常我们认为大小在1MB以内的文件称为小文件,百万级数量及以上称为海量文件,由此量化定义海量小文件。
    发表于 08-20 10:27 4023次阅读

    一文汇总并发http请求最快的几种实现方式用

    假如有一个文件,里面有 10 万个 url,需要对每个 url 发送 http 请求,并打印请求结果的状态码,如何编写代码尽可能快的完成这些任务呢? Python 并发编程有很多方法,多线程的标准库
    的头像 发表于 10-20 14:36 4190次阅读
    一文汇总<b class='flag-5'>并发</b>http<b class='flag-5'>请求</b>最快的几种实现方式用

    解密高并发业务场景典型的秒杀系统的架构

    很多小伙伴反馈说,高并发专题学了那么久,但是,在真正做项目时,仍然不知道如何下手处理高并发业务场景!甚至很多小伙伴仍然停留在只是简单的提供接口(CRUD)阶段,不知道学习的并发知识如何
    的头像 发表于 11-17 10:32 2162次阅读
    解密高<b class='flag-5'>并发</b>业务场景<b class='flag-5'>下</b>典型的秒杀系统的架构

    效率加倍,高并发场景接口请求合并方案

    假设我们3个用户(用户id分别是1、2、3),现在他们都要查询自己的基本信息,请求到服务器,服务器端请求数据库,发出3次请求。我们都知道数据库连接资源是相当宝贵的,那么我们怎么尽可能节省连接资源呢?
    的头像 发表于 01-13 10:09 779次阅读

    所有接口都用post请求的原因

    查看上面的区别,就会发现post在发送数据量大的请求时优势很显示,get则更适合获取静态资源、简单的查询等接口。 我个人在开发接口的时候也会注意,将简单的查询请求使用get方法,
    发表于 08-24 10:06 362次阅读
    所有<b class='flag-5'>接口</b>都用post<b class='flag-5'>请求</b>的原因

    并发场景请求合并

    我们在服务器端把请求合并,只发出一条SQL查询数据库,数据库返回后,服务器端处理返回数据,根据一个唯一请求ID,把数据分组,返回给对应用户。
    的头像 发表于 10-09 16:05 323次阅读
    高<b class='flag-5'>并发</b>场景<b class='flag-5'>下</b><b class='flag-5'>请求</b>合并

    服务器并发的概念

    自己调整系统的相关参数 并发的概念是什么?什么是并发? 对于服务器并发的概念,下面几点是错误的定义 ①服务器处理客户端请求的数量:没有时间、空间等限制,因此不能作为
    的头像 发表于 11-10 10:05 2862次阅读
    服务器<b class='flag-5'>并发</b>的概念

    实用RTD接口解决方案

    电子发烧友网站提供《实用RTD接口解决方案.pdf》资料免费下载
    发表于 11-16 16:05 1次下载
    实用RTD<b class='flag-5'>接口</b><b class='flag-5'>解决方案</b>