当前位置: 首页 > article >正文

【微服务】面试 4、限流

微服务限流技术总结

在这里插入图片描述

一、微服务业务面试题引入

在微服务业务面试中,限流是重要考点,常与分布式事务、分布式服务接口幂等解决方案、分布式任务调度等一同被考查。面试官一般会询问项目中是否实施限流及具体做法,回答需涵盖限流原因、采用的方式与算法等方面。

二、限流原因

(一)应对高并发

业务增长或特定活动(如抢券业务)时会出现流量高峰,大量请求可能超出系统处理能力,导致系统响应变慢、资源耗尽甚至崩溃,影响用户体验和系统稳定性,因此需要限流来保障系统正常运行。

(二)防范恶意攻击

恶意用户刷接口会占用大量系统资源,即使采用集群技术也可能无法应对大规模恶意流量,限流可有效阻止此类攻击,确保合法用户的服务质量。

在这里插入图片描述

三、常见限流方式及算法

(一)Tomcat 限流

通过设置 max rs 等参数控制最大连接数实现限流。例如,若 max rs 设置为 150,则 Tomcat 同时处理的连接数最多为 150。但在微服务架构下,每个微服务都需单独配置,管理复杂,适用于单体项目,在微服务项目中存在局限性。

(二)Nginx 限流

在这里插入图片描述

  1. 漏桶算法控制速率
    • 算法原理:基于漏桶算法,Nginx 将请求存入类似漏桶的结构,按照固定速率向外流出请求进行处理。如每秒固定流出 2 个请求,可使处理请求的速率保持稳定。
    • 配置参数
      • limit_req_zone:用于设置请求区域。
      • 可按用户 ip 或路径等方式定义限流对象,如 remote_addr 表示按 ip 限流。
      • 存储空间可根据实际需求设置,如 10M 可存储 16 万 ip 地址,用于记录限流相关信息。
      • rate10r/s 表示每秒最多处理 10 个请求。
      • burst 表示桶的大小,如设置为 20,则桶最多能存储 20 个请求,超过此数量的请求将被等待或抛弃。
      • nodelay 表示快速处理请求,包括快速处理桶内请求和快速抛弃超出限量的请求。
  2. 漏桶算法控制并发连接数
    • 配置参数
      • limit_conn:用于控制连接相关的限流操作。
      • 可按 ipserver_name(虚拟主机)等方式进行限流配置,如按 ip 限流时可设置内存大小为 10M,并可自定义引用。
      • 对于 server_name,可设置虚拟主机同时处理的并发连接数总数,如设置为 100,表示该服务最大并发连接数为 100;对于单个 ip,可设置其最多能持有的连接数,如 20 个。
    • 配置位置:需在具体的主机或反向代理中进行配置才能生效。
      在这里插入图片描述

(三)网关限流(以 Spring Cloud 网关为例)

在这里插入图片描述

  1. 令牌桶算法原理及配置
    • 算法原理:采用令牌桶算法,以固定速率生成令牌并存入令牌桶中。请求到达时需从桶中获取令牌,获取到令牌的请求才能被服务处理,未获取到令牌的请求则被阻塞或丢弃。例如,每秒生成 3 个令牌,如果某一秒内没有请求消耗令牌,下一秒来了 6 个请求,这 6 个请求可先获取上一秒剩余的 3 个令牌,同时本秒再生成 3 个令牌,从而可以处理这 6 个请求,这体现了令牌桶算法在处理突发流量时与漏桶算法的区别,即令牌桶处理请求的速率可能存在波动,而漏桶是以固定速率处理请求。
    • 配置参数
      • keyResolver:用于定义限流对象,可按 ip、路径或参数等方式定义,需要通过代码实现并被 Spring 管理,可使用 SPEL 表达式获取对象。
      • 设置令牌桶每秒填充的平均速度,即令牌生成速度,如设置为 1 表示每秒生成 1 个令牌。
      • 设置令牌桶的总容量,因为令牌桶不能无限制生成令牌,且令牌默认存储在 Redis 中,所以在网关配置文件中需要配置 Redis 连接信息。
    • 配置位置:在网关的配置文件(如 yaml)中,通过 request rate limit 局部过滤器进行设置。

(四)自定义连接器限流

在没有 Nginx 或网关的情况下,可采用自定义连接器限流,但在一般微服务项目中,通常会有 Nginx 或网关,所以在面试中重点应阐述 Nginx 和网关的限流方式。

四、面试回答要点

(一)业务场景描述

详细介绍项目业务及限流场景,例如在开展促销活动期间,如假期抢优惠券活动时,QPS(每秒查询率)可能会从平时的 10 - 50 飙升至 2000,为应对这种突发流量需要进行限流;或者为防止恶意攻击,若系统压测得出能承受的最大 QPS 为 1000,超过此值系统可能崩溃,因此需要控制每秒访问次数在 1000 以内。

(二)限流方式阐述

分别说明项目中采用的 Nginx 和网关限流方式及相关算法原理。对于 Nginx,提及控制速率的漏桶算法和控制并发连接数的配置及原理;对于网关,重点讲解令牌桶算法在网关中的应用及配置细节,如限流对象定义、令牌生成速度和桶容量设置等,强调这些限流方式如何保障系统在面对高并发和恶意攻击时的稳定运行。


http://www.kler.cn/a/503541.html

相关文章:

  • PyTorch 中的 Dropout 解析
  • 3D目标检测数据集——Nusence数据集
  • Java Bean Validation 不适用Spring的情况下自定义validation注解
  • 如何开放2375和2376端口供Docker daemon监听
  • 深入Android架构(从线程到AIDL)_30 JNI架构原理_Java与C的对接03
  • 论文笔记(六十一)Implicit Behavioral Cloning
  • 目标检测跟踪中的Siamese孪生网络与普通卷积网络(VGG、ResNet)有什么区别?
  • 如何将原来使用cmakelist编译的qt工程转换为可使用Visual Studio编译的项目
  • LCUS型 USB继电器模块 电脑串口控制开关 PC智能控制器在pc端使用Qt程序进行串口控制
  • vector的模拟实现(C++)
  • 软考信安18~网络安全测评技术与标准
  • Axure9笔记
  • 【CTFHub】REC-命令注入
  • 代码随想录Day34 | 62.不同路径,63.不同路径II,343.整数拆分,96.不同的二叉搜索树
  • 算法-查找数组对角线上最大的质数
  • 【IDEA 2024】学习笔记--文件选项卡
  • 我的年度总结
  • 高级运维:shell练习2
  • 【后端面试总结】tls中.crt和.key的关系
  • (EACL-2023)DyLoRA:使用动态无搜索低秩自适应对预训练模型进行参数高效调整
  • Springboot + vue 小区物业管理系统
  • OpenCV实现多尺度细节提升算法
  • Kafka消费者如何优雅下线
  • RTK北斗高精度定位4G执法记录仪在铁路作业安全风险管控中的应用
  • 【kubernetes】K8S节点状态的维护
  • C++并发编程之普通无锁队列与单生成者单消费者队列