面试题:说一下海量请求下的接口并发解决方案

news2024/10/5 19:11:54

文章目录

  • 服务限流
    • 限流算法
      • 1. 漏斗算法
      • 2. 令牌桶算法
      • 3. 滑窗算法
  • 接入层限流
    • Nginx限流
  • 本地接口限流
    • Semaphore
  • 分布式接口限流
    • 使用消息队列


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

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

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

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

服务限流

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

限流算法

1. 漏斗算法

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

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

在这里插入图片描述

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

2. 令牌桶算法

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

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

在这里插入图片描述

3. 滑窗算法

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

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

在这里插入图片描述
Sentinel的实现 和 TCP滑窗。

接入层限流

Nginx限流

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

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

limit_req模块基于IP:

http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

tgngine:

http://tengine.taobao.org/document_cn/http_limit_req_cn.html

本地接口限流

Semaphore

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

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

private final Semaphore permit = new Semaphore(40, true);

public void process(){

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

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

具体的 Semaphore 实现参考源码。

分布式接口限流

使用消息队列

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1148979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.4 安全服务

思维导图: 1.4 安全服务 定义:在通信开放系统中,为系统或数据传输提供足够安全的协议层服务。 RFC4949 定义:由系统提供的对系统资源进行特殊保护的处理或通信服务。安全服务通过安全机制来实现安全策略。 分类:X.800 …

加密机:保护您的信息安全的强大工具

在当今数字化的世界中,信息安全显得尤为重要。信息不仅关乎个人的隐私,也关乎企业的生死存亡。无论是个人还是企业,我们都需要一种强大的工具来保护我们的信息安全,这种工具就是加密机。 加密机是一种专门用于加密和解密电子数据的…

腾讯云香港服务器轻量24元一个月性能测试

腾讯云香港轻量应用服务器优惠价格24元一个月,一年288元,以前是30M峰值带宽,现在是20M峰值带宽,阿腾云atengyun.com分享腾讯云香港轻量应用服务器性能测评,包括香港轻量服务器配置价格表、CPU性能和CN2网络延迟测试&am…

中学化学实验室方案建设要求及注意事项

中学化学实验室是供学生进行化学实验和教师进行实验教学的地方。它通常包括实验台、通风设备、储存柜等设施,以及各种实验仪器和药品。在实验室中,学生可以通过实验学习化学知识,进行化学反应的观察和测量,提高自己的实践能力和科…

Vue3.3指北(五)

Vue3.3指北 1、axios1.1、axios是什么1.2、axios特点1.3、json-server1.4、安装axios 2、请求配置2.1、axios API2.2、请求别名的使用2.3、响应结构2.4、请求配置2.5、全局配置2.6、创建axios实例2.7、修改实例配置 3、发送Get请求4、发送POST请求5、发送并发请求6、axios拦截器…

轨迹规划 | 图解路径跟踪PID算法(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 PID控制基本原理2 基于PID的路径跟踪3 仿真实现3.1 ROS C实现3.2 Python实现3.3 Matlab实现 0 专栏介绍 🔥附C/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等)&a…

Python基础入门例程25-NP25 有序的列表(列表)

最近的博文: Python基础入门例程24-NP24 淘汰排名最后的学生(列表)-CSDN博客 Python基础入门例程23-NP23 删除好友(列表)-CSDN博客 Python基础入门例程22-NP22 删除简历(列表)-CSDN博客 目录 最…

进阶设计一(DDR3)——FPGA学习笔记<?>

一.简介 DDR3 SDRAM,以其单位存储量大、高数据带宽、读写速度快、价格相对便宜等优点 吸引了大批客户,占领市场较大份额。同时,作为内存条中不可缺少的一部分,DDR3 SDRAM 在计算机领域也占有一席之地。 要掌握 DDR3 SDRAM…

公众号流量主项目,只需搬运,一篇文章收益2000+

最近公众号流量主火得不行,大家都想着抓住这个赚钱机会。 连培训团队都看到了商机,开起了学费最低要四位数,甚至高达9880的培训班!看来这行确实是个风口项目啊。 以前公众号是个封闭的圈子,你的阅读量和粉丝数量是成正…

Vue指令大全:深入探索Vue提供的强大指令功能

目录 v-bind指令 v-on指令 v-if和v-show指令 v-for指令 自定义指令 其他常用指令 总结 Vue.js是一款流行的JavaScript框架,具备丰富的指令系统。Vue指令允许开发者直接在模板中添加特殊属性,以实现DOM操作、事件绑定、样式控制等功能。在本文中&a…

PHP+MySQL的大学宿舍管理系统【附源码】

视频如下: PHPMySQL宿舍管理系统【】 ** 图: ** 目 录 摘 要 I Abstract II 前 言 IV 1 概述 1 1.1系统开发的目的 1 1.2国内外的研究情况 1 1.3本文主要完成的工作 2 2 开发环境以及开发工具 3 2.1开发环境 3 2.1.1 硬件的开发环境 3 2.1.2 软件的开发…

【Unity ShaderGraph】| 快速制作一个 卡通阴影色块效果

前言 【Unity ShaderGraph】| 快速制作一个 卡通阴影色块效果一、效果展示二、卡通阴影色块效果三、应用实例 前言 本文将使用ShaderGraph制作一个卡通阴影色块的效果,可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章:【Unity …

同屏实时渲染百万级独立的3D可渲染对象

大规模渲染在游戏、家装、或者其他生产制造相关的环境下有直接的刚需,能独立渲染的3D对象越多,越容易实现复杂的场景需求。 下图是200多万(2 * 1024 * 1024)个可渲染的3D对象,的实时渲染情况截图。

API接口在电商数据采集【例如:淘宝平台商品详情SKU订单数据接口的采集 】中的接入说明及参数讲解

No.1 接口请求方式类型 常见的http请求方式包括:get(查)、post(增),除此之外还有put(改)、delete(删)等。接口所属类型是由业务决定的。比如你打开淘宝&…

【javaweb】学习日记Day13 - AOP 事务管理 切入点 连接点

目录 一、完善解散部门功能 二、spring 事务 (1)Transactional 事务管理 ① rollbackFor 控制异常类型 ② propagation 事务传播控制 1、定义解散部门操作日记 三、AOP基础 1、概述 2、快速入门 (1)案例:统…

c++拷贝构造与赋值运算符重载

目录 目录: 1:拷贝构造 2:赋值运算符重载 前言:在上一章我们已经学习过了,构造与析构这两个默认成员函数了,接下来让我们一起来学习另外两个重要的默认成员函数。 首先让我们来讲一下默认成员函数这个概念…

[架构之路-245/创业之路-76]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业资源管理计划ERP

目录 前言: 一、企业信息化的结果:常见企业信息化软件 1.1 企业资源管理计划 1.1.1 什么是ERP:企业最常用的信息管理系统 1.1.2 ERP的演进过程 1.1.3 EPR模块 1.1.4 EPR五个层级 1.1.5 企业EPR业务总体流程图 1.1.6 什么类型的企业需…

微信小程序云开发如何优雅的实现模糊查询

微信官方自从推出微信小程序云开发之后,让小程序开发的门槛再次降低,你可以不需要掌握任何后端的语言和数据库,有一些js的基本功,就可以完成一个完整带前后端交互功能的小程序项目。今天我们介绍一个日常开发中非常常见的需求&…

转化率(CVR)是什么意思,怎么计算和提高转化率?

转化率指的是在一定时间范围内,企业在线上或线下从事某项营销推广(比如竞价广告)活动时,成功完成转化行为的次数占推广信息总点击次数的百分比率。它是产品营销推广中的一个重要数据指标,转化率越高,成本越…

【教3妹学编辑-算法题】H 指数 II

3妹:2哥早啊, 新的一周开始了,奥利给!!! 2哥 :3妹,今天起的很早嘛,精神也很饱满。 3妹:昨天睡的早,早睡早起好身体! 2哥:既然离时间还…