【微服务】面试 4、限流

news2025/1/13 19:50:11

微服务限流技术总结

在这里插入图片描述

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

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

二、限流原因

(一)应对高并发

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

(二)防范恶意攻击

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

在这里插入图片描述

三、常见限流方式及算法

(一)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.coloradmin.cn/o/2276118.html

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

相关文章

爬虫基础之爬取歌曲宝歌曲批量下载

声明:本案列仅供学习交流使用 任何用于非法用途均与本作者无关 需求分析: 网站:邓紫棋-mp3在线免费下载-歌曲宝-找歌就用歌曲宝-MP3音乐高品质在线免费下载 (gequbao.com) 爬取 歌曲名 歌曲 实现歌手名称下载所有歌曲 本案列所使用的模块 requests (发送…

树莓派-5-GPIO的应用实验之GPIO的编码方式和SDK介绍

文章目录 1 GPIO编码方式1.1 管脚信息1.2 使用场合1.3 I2C总线1.4 SPI总线2 RPI.GPIO2.1 PWM脉冲宽度调制2.2 静态函数2.2.1 函数setmode()2.2.2 函数setup()2.2.3 函数output()2.2.4 函数input()2.2.5 捕捉引脚的电平改变2.2.5.1 函数wait_for_edge()2.2.5.2 函数event_detect…

Scala分布式语言二(基础功能搭建、面向对象基础、面向对象高级、异常、集合)

章节3基础功能搭建 46.函数作为值三 package cn . itbaizhan . chapter03 // 函数作为值,函数也是个对象 object FunctionToTypeValue { def main ( args : Array [ String ]): Unit { //Student stu new Student() /*val a ()>{"GTJin"…

CVE-2025-22777 (CVSS 9.8):WordPress | GiveWP 插件的严重漏洞

漏洞描述 GiveWP 插件中发现了一个严重漏洞,该插件是 WordPress 最广泛使用的在线捐赠和筹款工具之一。该漏洞的编号为 CVE-2025-22777,CVSS 评分为 9.8,表明其严重性。 GiveWP 插件拥有超过 100,000 个活跃安装,为全球无数捐赠平…

支付宝租赁小程序提升租赁行业效率与用户体验

内容概要 在当今数字化的世界里,支付宝租赁小程序的出现构建了一种新的租赁模式,使得用户在使用过程中体验更加流畅。想象一下,你在寻找租赁服务时,不再需要繁琐的流程和冗长的等待,只需通过手机轻松点击几下&#xf…

关于使用FastGPT 摸索的QA

近期在通过fastGPT,创建一些基于特定业务场景的、相对复杂的Agent智能体应用。 工作流在AI模型的基础上,可以定义业务逻辑,满足输出对话之外的需求。 在最近3个月来的摸索和实践中,一些基于经验的小问题点(自己也常常…

服务器/电脑与代码仓gitlab/github免密连接

git config --global user.name "xxxx" git config --global user.email "xxxxxx163.com" #使用注册GitHub的邮箱 生成对应邮箱的密码对 ssh-keygen -t rsa -b 4096 -C "xxxxxx163.com" 把公钥id_rsa.pub拷贝到github中 Setting----->…

【C语言系列】函数递归

函数递归 一、递归是什么?1.1尾递归 二、递归的限制条件三、递归举例3.1举例一:求n的阶乘3.2举例二:顺序打印一个整数的每一位 四、递归与迭代4.1举例三:求第n个斐波那契数 五、拓展学习青蛙跳台问题 一、递归是什么? …

springboot 默认的 mysql 驱动版本

本案例以 springboot 3.1.12 版本为例 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.12</version><relativePath/> </parent> 点击 spring-…

[QCustomPlot] 交互示例 Interaction Example

本文是官方例子的分析: Interaction Example 推荐笔记: qcustomplot使用教程–基本绘图 推荐笔记: 4.QCustomPlot使用-坐标轴常用属性 官方例子需要用到很多槽函数, 这里先一次性列举, 自行加入到qt的.h中.下面开始从简单的开始一个个分析. void qcustomplot_main_init(void); …

openMetaData docker方式安装部署记录

OpenMetadata一站式元数据管理平台&#xff0c;是一款功能强大的开源元数据管理平台&#xff0c;旨在帮助企业更好地发现、理解和管理其数据资产。它提供了一套全面的工具和功能&#xff0c;涵盖了数据发现、数据血缘、数据质量、数据探查、数据治理和团队协作等多个方面。 那…

57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景

57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景 实现效果 该案例实现了使用Three.js创建一个带有聚光灯和旋转立方体的3D场景。 知识点 WebGLRenderer&#xff08;WebGL渲染器&#xff09; THREE.WebGLRenderer 是 Three.js 中用于将场景渲染为 WebGL 内容的核…

本地视频进度加入笔记+根据进度快速锁定视频位置

本地视频进度记录快速回溯 引言 在学习的过程中, 如果我们想快速记录当前看视频的位置, 后续回溯查找就会非常方便了。 实现效果 进度记录 通过按下快捷键ctrlaltu&#xff0c; 快速记录当前视频的进度信息,然后复制到typora软件内 快速回溯 在typora软件内, 选中视频索引…

Spring Boot 支持哪些日志框架

Spring Boot 支持多种日志框架&#xff0c;主要包括以下几种&#xff1a; SLF4J (Simple Logging Facade for Java) Logback&#xff08;默认&#xff09;Log4j 2Java Util Logging (JUL) 其中&#xff0c;Spring Boot 默认使用 SLF4J 和 Logback 作为日志框架。如果你需要使…

快速导入请求到postman

1.确定请求&#xff0c;右键复制为cURL(bash) 2.postman菜单栏Import-Raw text&#xff0c;粘贴复制的内容保存&#xff0c;请求添加成功

Golang的网络流量分配策略

## 1. Golang中的网络流量分配策略 简介 在Golang中&#xff0c;网络流量分配策略是指如何有效地管理和优化网络请求的分配&#xff0c;以提高系统的性能和稳定性。优秀的网络流量分配策略能够使系统更好地应对高并发和大流量的情况&#xff0c;同时有效地避免网络拥堵和性能瓶…

【硬件介绍】Type-C接口详解

一、Type-C接口概述 Type-C接口特点&#xff1a;以其独特的扁头设计和无需区分正反两面的便捷性而广受欢迎。这种设计大大提高了用户的使用体验&#xff0c;避免了传统USB接口需要多次尝试才能正确插入的问题。Type-C接口内部结构&#xff1a;内部上下两排引脚的设计虽然可能不…

二、BIO、NIO编程与直接内存、零拷贝

一、网络通信 1、什么是socket&#xff1f; Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层&#xff0c;它是一组接口&#xff0c;一般由操作 系统提供。客户端连接上一个服务端&#xff0c;就会在客户端中产生一个 socket 接口实例&#xff0c;服务端每接受 一个客户端…

Android车机DIY开发之软件篇(九)默认应用和服务修改

Android车机DIY开发之软件篇(九)默认应用和服务修改 默认应用位置 ~/packages/apps/Car 增加APP 1.增加 XXXX.app 和Android.mk 2. 修改~/build/make/target/product/handheld_system_ext.mk 默认服务位置 ~/frameworks/base/services/java/com/android/server 查看服务列…

【Rust】错误处理机制

目录 思维导图 引言 一、错误处理的重要性 1.1 软件中的错误普遍存在 1.2 编译时错误处理要求 二、错误的分类 2.1 可恢复错误&#xff08;Recoverable Errors&#xff09; 2.2 不可恢复错误&#xff08;Unrecoverable Errors&#xff09; 三、Rust 的错误处理机制 3…