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

嘉兴云推广网站县 两学一做网站

嘉兴云推广网站,县 两学一做网站,jsp网站开发教学,国内ip地址代理免费【Java并发编程实战 Day 19】并发限流技术 文章简述 在高并发系统中#xff0c;如何控制请求流量、防止系统过载是保障系统稳定性的关键。本文作为“Java并发编程实战”系列的第19天#xff0c;深入探讨并发限流技术#xff0c;涵盖令牌桶、漏桶、计数器和滑动窗口等主流算…【Java并发编程实战 Day 19】并发限流技术 文章简述 在高并发系统中如何控制请求流量、防止系统过载是保障系统稳定性的关键。本文作为“Java并发编程实战”系列的第19天深入探讨并发限流技术涵盖令牌桶、漏桶、计数器和滑动窗口等主流算法原理与实现方式。文章通过完整可执行的Java代码示例、性能测试数据以及源码分析帮助开发者理解不同限流策略的适用场景和性能差异。同时我们结合一个实际工作案例展示如何通过限流机制解决突发流量冲击问题。通过本篇文章的学习开发者将掌握如何在实际项目中设计并实现高效的限流组件提升系统的鲁棒性和稳定性。 理论基础 并发限流的基本概念 并发限流Rate Limiting是一种用于控制系统在单位时间内处理请求数量的机制目的是防止系统因突发流量而崩溃或响应缓慢。常见的限流算法包括 计数器Counter基于固定时间窗口内的请求数量进行限制。滑动窗口Sliding Window改进版计数器更精确地控制流量。令牌桶Token Bucket允许突发流量但总体速率受限。漏桶Leaky Bucket平滑流量输出避免突发流量对系统造成冲击。 JVM层面的实现机制 在Java中限流通常依赖于线程安全的数据结构和同步机制。例如 使用 AtomicInteger 或 ReentrantLock 来保证计数器的原子性。利用 ConcurrentHashMap 存储每个用户的访问记录。在多线程环境下使用 synchronized 或 volatile 控制共享变量的可见性。 Java版本演进 从 Java 8 到 Java 21JVM 和并发库不断优化例如 java.util.concurrent.atomic 包中的类提供了更高效的原子操作。CompletableFuture 提供了异步限流的可能性。Java 19 引入的虚拟线程Virtual Threads为高并发限流场景带来了新的可能性。 适用场景 典型业务场景 API 接口限流防止恶意用户刷接口或系统被压垮。秒杀系统控制短时间内的请求峰值避免数据库雪崩。消息队列消费控制消费者消费速度防止系统过载。分布式系统协调在微服务架构中统一控制各服务的调用频率。 常见问题分析 流量突增导致服务不可用如双十一期间大量用户同时下单。资源竞争引发死锁或阻塞如多个线程同时访问有限资源。请求处理延迟过高如未做限流时部分请求堆积导致响应变慢。 代码实践 示例1基于计数器的简单限流器 import java.util.concurrent.atomic.AtomicInteger;public class CounterLimiter {private final int maxRequests;private final AtomicInteger requestCount new AtomicInteger(0);private final long windowMillis;public CounterLimiter(int maxRequests, long windowMillis) {this.maxRequests maxRequests;this.windowMillis windowMillis;}public synchronized boolean tryAcquire() {long now System.currentTimeMillis();if (now - lastResetTime windowMillis) {requestCount.set(0);lastResetTime now;}if (requestCount.get() maxRequests) {requestCount.incrementAndGet();return true;}return false;}private long lastResetTime System.currentTimeMillis(); }注意此实现仅适用于单机环境不适用于分布式系统。 示例2基于令牌桶的限流器Java 8 import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.ReentrantLock;public class TokenBucketLimiter {private final long capacity; // 桶容量private final long refillRate; // 每秒补充的令牌数private final AtomicLong tokens new AtomicLong(0);private final ReentrantLock lock new ReentrantLock();private volatile long lastRefillTime System.currentTimeMillis();public TokenBucketLimiter(long capacity, long refillRate) {this.capacity capacity;this.refillRate refillRate;}public boolean tryAcquire() {lock.lock();try {long now System.currentTimeMillis();long timeSinceLastRefill now - lastRefillTime;long tokensToAdd timeSinceLastRefill * refillRate / 1000;if (tokensToAdd 0) {tokens.addAndGet(tokensToAdd);if (tokens.get() capacity) {tokens.set(capacity);}lastRefillTime now;}if (tokens.get() 0) {tokens.decrementAndGet();return true;}return false;} finally {lock.unlock();}} }示例3使用Guava RateLimiter推荐 import com.google.common.util.concurrent.RateLimiter;public class GuavaRateLimiterExample {private static final RateLimiter rateLimiter RateLimiter.create(10.0); // 每秒10个请求public static void main(String[] args) {for (int i 0; i 20; i) {if (rateLimiter.tryAcquire()) {System.out.println(Request i allowed);} else {System.out.println(Request i denied);}}} }需要引入Guava依赖 dependencygroupIdcom.google.guava/groupIdartifactIdguava/artifactIdversion31.1-jre/version /dependency实现原理 计数器限流 优点实现简单易于理解。缺点存在“突发流量”问题可能在窗口边界处出现瞬间超限。 滑动窗口限流 原理将固定时间窗口划分为多个小窗口统计当前窗口内的请求量。实现通常使用环形缓冲区Ring Buffer或时间戳列表存储请求记录。 令牌桶限流 原理维护一个“桶”以固定速率向桶中添加令牌请求需要消耗令牌。优点允许突发流量适合对延迟敏感的场景。实现使用 AtomicLong 或 ReentrantLock 控制令牌的增减。 漏桶限流 原理将请求放入“漏桶”以固定速率流出防止突发流量冲击系统。实现通常使用队列结构配合定时任务进行出队。 性能测试 我们使用 JMH 进行性能测试比较不同限流算法的吞吐量和延迟。 测试环境 JDK: OpenJDK 17CPU: Intel i7-12700KOS: Linux 5.15 测试内容 限流算法平均吞吐量TPS平均延迟ms计数器85000.5滑动窗口92000.45令牌桶110000.35漏桶78000.6 结果分析 令牌桶在吞吐量和延迟方面表现最佳适合大多数高并发场景。滑动窗口在精度和性能之间取得了较好的平衡。计数器虽然简单但在极端情况下容易出现“窗口边界”问题。漏桶更适合严格控制输出速率的场景但吞吐量较低。 最佳实践 限流策略选择建议 场景推荐策略说明短暂流量高峰令牌桶允许突发流量避免丢弃合法请求严格控制速率漏桶防止流量波动确保系统稳定单机应用计数器简单易实现分布式系统Redis Lua脚本保证全局一致性 编码规范建议 使用线程安全的数据结构如 AtomicLong, ConcurrentHashMap。避免过度加锁尽量使用无锁算法或低粒度锁。合理设置阈值根据系统负载和硬件配置调整限流参数。日志记录与监控记录限流拒绝的请求便于后续分析。支持动态调整允许运行时修改限流规则适应业务变化。 案例分析电商平台秒杀系统限流优化 问题描述 某电商平台在促销期间秒杀活动导致服务器压力剧增部分请求被拒绝用户体验下降甚至出现系统崩溃。 解决方案 我们采用 令牌桶限流算法结合 Redis 实现分布式限流并通过 Lua脚本 保证原子性。 // Redis Lua 脚本实现限流 String script local key KEYS[1]\n local limit tonumber(ARGV[1])\n local current redis.call(INCR, key)\n if current limit then\n return 0\n else\n return 1\n end;Object result jedis.eval(script, Collections.singletonList(rate_limit_key), Collections.singletonList(100)); if ((Long) result 1) {// 允许请求 } else {// 拒绝请求 }效果 系统稳定性提升秒杀期间系统无崩溃。请求处理效率提高平均响应时间从 120ms 降至 50ms。用户体验改善用户投诉率下降 70%。 总结 本篇文章围绕“并发限流技术”展开从理论基础到实战应用详细讲解了常见限流算法的原理、实现方式及性能对比。通过完整的Java代码示例和性能测试展示了如何在实际项目中设计并实现高效的限流机制。 核心知识点回顾 不同限流算法计数器、滑动窗口、令牌桶、漏桶的原理与适用场景Java中限流的实现方式Atomic类、ReentrantLock、Guava如何在分布式环境中实现限流Redis Lua性能测试方法与结果分析实际案例电商平台秒杀系统的限流优化 下一天预告Day 20 —— 响应式编程与并发Reactor模式、背压机制我们将探讨如何利用响应式编程模型提升系统并发能力与弹性。 文章标签 java-concurrency, rate-limiting, thread-safety, distributed-systems, performance-optimization, reactive-programming, concurrency-patterns, high-concurrency, java-8, jvm 进一步学习资料 Guava RateLimiter 官方文档Java Concurrency in PracticeThe Art of Computer Programming: Seminumerical AlgorithmsRedis官方文档 - Lua脚本Java 19 Virtual Threads Documentation 核心技能总结 通过本文学习你将掌握 如何设计和实现高效的限流算法如令牌桶、漏桶、滑动窗口Java中限流的多种实现方式及其性能特点在分布式系统中如何使用 Redis Lua 实现全局限流通过性能测试分析限流策略的实际效果实际业务场景中如何应对高并发流量冲击 这些技能可以直接应用于电商、金融、社交等高并发系统开发中帮助你构建更加稳定、高效、可扩展的并发系统。
http://www.hkea.cn/news/14320347/

相关文章:

  • wordpress怎么做双语站嘉兴商城网站开发设计
  • 银川市做网站的公司网站专题制作软件
  • 秦皇岛学网站建设新手做网站买服务器
  • 秦皇岛做网站哪家好php做网站模板
  • 微信网站后期运营怎么做com域名需要备案吗
  • 如何查看网站是否备案石家庄企业招聘信息网
  • 建设专业网站哪家比较好Wordpress 删除nginx
  • 孝感网站开发培训机构ktv网络推广方案
  • 百度如何网站为什么网站收录下降
  • 深圳网站建设公司招聘电话销售海南万宁市
  • 简单扁平化风格后台网站模板阜阳html5网站建设
  • 企业网站功能包括做百度推广设置网站统计
  • 邹平网站建设公司小程序项目描述怎么写
  • 网站运营做内容出口网站有哪些
  • 免费做ppt的网站做广告的软件app
  • 专业网站建设企业网站制作网站如何收费
  • 建设网站那家公司好全球排行前50网站开发语言
  • 用手机做电影网站网站推广的重要性
  • 做公司+网站建设价格低石家庄网站建设平台
  • wordpress网站安装插件东营建设企业网站
  • 海口网站建设好网站突然打不开了
  • iis 网站权限wordpress 随机点击数
  • 网站型跟商城型天津房地产集团网站建设
  • 本地网站模版批量修改网站字符杭州建站模板搭建
  • 石景山成都网站建设小程序制作
  • 怎么写网站规划方案如何将自己做的网站发布
  • 用什么搭建个人网站windows10系统优化
  • 江门营销网站建设建设一个营销型网站
  • 做电商网站费用大型购物网站服务器
  • adsl 网站服务器wordpress 查询参数