用 Spring Boot 实现秒杀系统的流量控制:计数器算法与令牌桶算法

简介: 用 Spring Boot 实现秒杀系统的流量控制:计数器算法与令牌桶算法

用 Spring Boot 实现秒杀系统的流量控制:计数器算法与令牌桶算法

在秒杀系统中,流量控制是至关重要的一环。为了防止瞬时的请求激增导致系统崩溃,我们可以采用计数器算法和令牌桶算法来限制用户的请求频率。本文将结合 Spring Boot,通过具体的代码示例介绍这两种算法,并使用生动的比喻来解释其原理。

1. 计数器算法

计数器算法是一种简单直观的流量控制方法。想象一下,我们有一个包裹计数器,每当用户发起秒杀请求,计数器就加一。当计数器超过设定的阈值时,我们暂时停止接收请求,以避免系统过载。

实现计数器算法的 Spring Boot 代码

@RestController
public class SeckillController {
    private static final int REQUEST_THRESHOLD = 100; // 设定的请求阈值
    private static int requestCounter = 0; // 请求计数器
    @GetMapping("/seckill")
    public ResponseEntity<String> seckill() {
        if (requestCounter < REQUEST_THRESHOLD) {
            // 处理秒杀逻辑
            requestCounter++;
            return ResponseEntity.ok("秒杀成功!");
        } else {
            // 请求超过阈值,返回限流提示
            return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).body("请求过于频繁,请稍后重试。");
        }
    }
}

在这个例子中,SeckillController中的 /seckill 接口使用计数器算法来控制请求频率。当请求计数未超过阈值时,允许秒杀请求;当计数超过阈值时,返回请求过于频繁的提示。

2. 令牌桶算法

令牌桶算法是一种更为灵活的流量控制方式。我们可以将其比喻为一个装有令牌的桶,系统以一定的速率不断往桶中放入令牌。用户请求时,需要从桶中获取令牌,如果桶中没有足够的令牌,则拒绝请求。

实现令牌桶算法的 Spring Boot 代码

import java.util.concurrent.TimeUnit;
@RestController
public class SeckillController {
    private static final int REQUEST_RATE = 10; // 令牌桶速率(每秒放入的令牌数)
    private static final int BUCKET_CAPACITY = 20; // 令牌桶容量
    private static int availableTokens = BUCKET_CAPACITY; // 当前可用的令牌数量
    private static long lastRefillTime = System.currentTimeMillis(); // 上次令牌补充时间
    @GetMapping("/seckill")
    public ResponseEntity<String> seckill() {
        refillTokens(); // 补充令牌
        if (tryConsumeToken()) {
            // 处理秒杀逻辑
            return ResponseEntity.ok("秒杀成功!");
        } else {
            // 令牌不足,返回限流提示
            return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).body("请求过于频繁,请稍后重试。");
        }
    }
    private synchronized void refillTokens() {
        long currentTime = System.currentTimeMillis();
        long elapsedTime = currentTime - lastRefillTime;
        int tokensToAdd = (int) (elapsedTime * (REQUEST_RATE / 1000.0));
        availableTokens = Math.min(BUCKET_CAPACITY, availableTokens + tokensToAdd);
        lastRefillTime = currentTime;
    }
    private synchronized boolean tryConsumeToken() {
        if (availableTokens >= 1) {
            availableTokens--;
            return true;
        } else {
            return false;
        }
    }
}

在这个例子中,SeckillController中的 /seckill 接口使用令牌桶算法来控制请求频率。通过 refillTokens 方法定期补充令牌,通过 tryConsumeToken 方法尝试获取令牌,从而控制秒杀请求的处理。

相关文章
|
负载均衡 算法 Java
Spring Cloud全解析:负载均衡算法
本文介绍了负载均衡的两种方式:集中式负载均衡和进程内负载均衡,以及常见的负载均衡算法,包括轮询、随机、源地址哈希、加权轮询、加权随机和最小连接数等方法,帮助读者更好地理解和应用负载均衡技术。
535 2
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
430 0
|
存储 人工智能 Java
Spring AI与DeepSeek实战四:系统API调用
在AI应用开发中,工具调用是增强大模型能力的核心技术,通过让模型与外部API或工具交互,可实现实时信息检索(如天气查询、新闻获取)、系统操作(如创建任务、发送邮件)等功能;本文结合Spring AI与大模型,演示如何通过Tool Calling实现系统API调用,同时处理多轮对话中的会话记忆。
2739 57
|
10月前
|
存储 人工智能 自然语言处理
用Spring AI搭建本地RAG系统:让AI成为你的私人文档助手
想让AI帮你读懂PDF文档吗?本文教你用Spring AI和Ollama搭建一个本地RAG系统,让AI成为你的私人文档助手。无需GPU,无需云端API,只需几行代码,你的文档就能开口说话了!
2042 2
|
消息中间件 存储 Java
📨 Spring Boot 3 整合 MQ 构建聊天消息存储系统
本文详细介绍了如何使用Spring Boot 3结合RabbitMQ构建高效可靠的聊天消息存储系统。通过引入消息队列,实现了聊天功能与消息存储的解耦,解决了高并发场景下直接写入数据库带来的性能瓶颈问题。文章首先分析了不同MQ产品的特点及适用场景,最终选择RabbitMQ作为解决方案,因其成熟稳定、灵活路由和易于集成等优势。接着,通过Docker快速部署RabbitMQ,并完成Spring Boot项目的配置与代码实现,包括生产者发送消息、消费者接收并处理消息等功能。最后,通过异步存储机制,既保证了消息的即时性,又实现了可靠持久化。
925 0
📨 Spring Boot 3 整合 MQ 构建聊天消息存储系统
|
12月前
|
机器学习/深度学习 存储 监控
上网管理监控软件的 Go 语言流量特征识别算法实现与优化
本文探讨基于Go语言的流量特征识别算法,用于上网管理监控软件。核心内容涵盖AC自动机算法原理、实现及优化,通过路径压缩、哈希表存储和节点合并策略提升性能。实验表明,优化后算法内存占用降低30%,匹配速度提升20%。在1000Mbps流量下,CPU利用率低于10%,内存占用约50MB,检测准确率达99.8%。未来可进一步优化高速网络处理能力和融合机器学习技术。
315 10
|
Java UED Sentinel
微服务守护神:Spring Cloud Sentinel,让你的系统在流量洪峰中稳如磐石!
【8月更文挑战第29天】Spring Cloud Sentinel结合了阿里巴巴Sentinel的流控、降级、熔断和热点规则等特性,为微服务架构下的应用提供了一套完整的流量控制解决方案。它能够有效应对突发流量,保护服务稳定性,避免雪崩效应,确保系统在高并发下健康运行。通过简单的配置和注解即可实现高效流量控制,适用于高并发场景、依赖服务不稳定及资源保护等多种情况,显著提升系统健壮性和用户体验。
404 1
|
12月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
304 3
|
11月前
|
Java 调度 流计算
基于Java 17 + Spring Boot 3.2 + Flink 1.18的智慧实验室管理系统核心代码
这是一套基于Java 17、Spring Boot 3.2和Flink 1.18开发的智慧实验室管理系统核心代码。系统涵盖多协议设备接入(支持OPC UA、MQTT等12种工业协议)、实时异常检测(Flink流处理引擎实现设备状态监控)、强化学习调度(Q-Learning算法优化资源分配)、三维可视化(JavaFX与WebGL渲染实验室空间)、微服务架构(Spring Cloud构建分布式体系)及数据湖建设(Spark构建实验室数据仓库)。实际应用中,该系统显著提升了设备调度效率(响应时间从46分钟降至9秒)、设备利用率(从41%提升至89%),并大幅减少实验准备时间和维护成本。
530 0
|
人工智能 自然语言处理 Java
对话即服务:Spring Boot整合MCP让你的CRUD系统秒变AI助手
本文介绍了如何通过Model Context Protocol (MCP) 协议将传统Spring Boot服务改造为支持AI交互的智能系统。MCP作为“万能适配器”,让AI以统一方式与多种服务和数据源交互,降低开发复杂度。文章以图书管理服务为例,详细说明了引入依赖、配置MCP服务器、改造服务方法(注解方式或函数Bean方式)及接口测试的全流程。最终实现用户通过自然语言查询数据库的功能,展示了MCP在简化AI集成、提升系统易用性方面的价值。未来,“对话即服务”有望成为主流开发范式。
9412 7

热门文章

最新文章