【微服务】面试 4、限流

news/2025/1/16 4:37:53 标签: 微服务, 面试, 架构

微服务限流技术总结

在这里插入图片描述

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

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

二、限流原因

(一)应对高并发

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

(二)防范恶意攻击

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

在这里插入图片描述

三、常见限流方式及算法

(一)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.niftyadmin.cn/n/5824628.html

相关文章

C# 中对 Task 中的异常进行捕获

以下是在 C# 中对 Task 中的异常进行捕获的几种常见方法: 方法一:使用 try-catch 语句 你可以使用 try-catch 语句来捕获 Task 中的异常,尤其是当你使用 await 关键字等待任务完成时。 using System; using System.Threading.Tasks;class …

AI知识-TF-IDF技术(Term Frequency-Inverse Document Frequency)

摘要 TF-IDF(Term Frequency-Inverse Document Frequency)是一种常见的统计方法,用于评估一个词对于一个文档集或一个语料库中的其中一份文档的重要性。本文将全面阐述TF-IDF的通俗理解、技术原理、应用场景,并做以总结。 通俗理…

MYSQL学习笔记(一):准备数据和数据库的最基本命令

前言: 学习和使用数据库可以说是程序员必须具备能力,这里将更新关于MYSQL的使用讲解,大概应该会更新30篇,涵盖入门、进阶、高级(一些原理分析);这一篇是入门准备数据和一些关于数据库的操作命令;虽然MYSQL命令很多&…

探索 AI 自动化编程:效率革命与未来教育的转型

随着人工智能技术的快速发展,AI 自动化编程工具正日益影响软件开发行业。从代码生成到项目管理,这些工具不仅加速了开发流程,还引发了对编程职业未来的深入思考。那么,AI 自动化编程的现状如何?它如何影响程序员的日常…

C++笔记:打包独立运行的exe(在静态库中使用MFC)

从window7到window11都默认安装有C依赖库,见如下 但是一些企业用的特殊window版本可能没有这个依赖库,导致Visual Studio生成的exe无法运行(报缺失dll),就需要打包生成时使用静态库依赖。 共两步: 第一步…

【Axure视频教程】中继器表格——拖动排序

今天教大家在Axure用中继器制作拖动排序效果的原型模板,我们可以通过拖动的方式,将对应的行摆放到任意位置,效果如下图所示: 这个原型模板是用中继器制作的,所以使用也很简单,只需要在中继器表格里填写对应…

Navicat Premium 原生支持阿里云 PolarDB 数据库

近日,我司旗下的 Navicat Premium 软件通过了阿里云 PolarDB 数据库产品生态集成认证,这标志着 Navicat 通过原生技术全面实现了对秒级弹性、高性价比、稳定可靠的PolarDB 数据库三大引擎(PolarDB MySQL版、PolarDB PostgreSQL版和 PolarDB f…

Axure9笔记

快速入门 原型图种类 1.线框图 2.高保真图 3.简易需求文档(PRD) tips 按住shift可以等比缩放 旋转:ctrl按角角 矢量图素材: iconfont-阿里巴巴矢量图标库 复制svg图-->将svg图换为形状 截屏: Windows&…