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

wordpress站点标题和副标题百度网盘搜索

wordpress站点标题和副标题,百度网盘搜索,网站建设经验与团队,提高wordpress背景 近期在做调用第三方系统接口的业务场景时,经常会出现接口超时的问题,跟第三方系统一番扯皮后发现原来是他们做了限流,限制了我们一秒钟只能请求2次,所以需要我们自己做好限流,控制我们的请求频率。 令牌桶算法&a…

背景
近期在做调用第三方系统接口的业务场景时,经常会出现接口超时的问题,跟第三方系统一番扯皮后发现原来是他们做了限流,限制了我们一秒钟只能请求2次,所以需要我们自己做好限流,控制我们的请求频率。

令牌桶算法(Token Bucket Algorithm)是一种常用的流量控制和限流算法,广泛用于网络传输、API 限流、系统资源管理等场景中。它通过一个“桶”来模拟请求的处理能力,并以固定的速率往桶中放入令牌(token),只有拿到令牌的请求才能被处理。


🧠 基本原理

令牌桶算法的核心思想是:

  • 桶中可以存放一定数量的“令牌”。
  • 系统以固定速率往桶中添加令牌(比如每秒添加10个令牌)。
  • 当有请求到来时,必须从桶中取出一个令牌,如果桶中没有令牌,则请求被拒绝或等待。
  • 桶有容量上限,超过容量的令牌会被丢弃。

这样就可以限制请求的平均速率,同时允许一定程度的突发流量(因为桶中可以存储令牌)。


🔍 特点

特性描述
平均速率限制可以限制请求的平均速率
支持突发流量如果桶中有积压的令牌,可以在短时间内处理大量请求
实现简单逻辑清晰,容易实现
非阻塞可以选择是否等待令牌

📦 示例说明

假设我们有一个令牌桶:

  • 容量为 10 个令牌;
  • 每秒添加 2 个令牌;
  • 请求需要获取令牌才能执行。

场景举例:

  1. 正常情况:每秒最多处理 2 个请求;
  2. 空闲后突发:如果前几秒没有请求,桶里积累了多个令牌,这时可以处理突发的多个请求;
  3. 超出限制:当请求速度过快,桶中没有令牌时,后续请求将被拒绝。

💻 Java 实现示例

下面是两个简单的 Java 实现

非阻塞,获取不到令牌就直接拒绝:

import java.util.concurrent.atomic.AtomicLong;public class TokenBucket {// 每秒生成的令牌数private final long capacity;// 桶的最大容量private final long rate;// 当前令牌数量private AtomicLong tokens = new AtomicLong(0);// 上一次补充令牌的时间private long lastRefillTime = System.currentTimeMillis();public TokenBucket(long rate, long capacity) {this.rate = rate;this.capacity = capacity;this.tokens.set(capacity); // 初始填满}/*** 尝试获取一个令牌*/public synchronized boolean tryConsume() {refill();if (tokens.get() > 0) {tokens.decrementAndGet();return true;}return false;}/*** 根据时间差补充令牌*/private void refill() {long now = System.currentTimeMillis();long timeElapsed = now - lastRefillTime;// 计算应该补充的令牌数long tokensToAdd = (timeElapsed * rate) / 1000; // 毫秒转秒if (tokensToAdd > 0) {lastRefillTime = now;long newTokens = Math.min(tokens.get() + tokensToAdd, capacity);tokens.set(newTokens);}}public static void main(String[] args) throws InterruptedException {TokenBucket bucket = new TokenBucket(2, 5); // 每秒2个令牌,最多存5个for (int i = 0; i < 10; i++) {if (bucket.tryConsume()) {System.out.println("Request " + (i + 1) + " processed.");} else {System.out.println("Request " + (i + 1) + " rejected.");}Thread.sleep(200); // 模拟请求频率}}
}

阻塞,获取不到令牌就等待执行:

package org.ffjy.lld.ffcrm.common;import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.TimeUnit;public class TokenBucket {// 桶的最大容量private final long capacity;// 每秒生成的令牌数private final long rate;// 当前令牌数量private AtomicLong tokens = new AtomicLong(0);// 上一次补充令牌的时间private long lastRefillTime = System.currentTimeMillis();// 使用锁和条件变量实现等待机制private final Lock lock = new ReentrantLock();private final Condition notEmpty = lock.newCondition();public TokenBucket(long rate, long capacity) {this.rate = rate;this.capacity = capacity;this.tokens.set(capacity); // 初始填满}/*** 获取一个令牌,如果没有令牌则等待*/public void acquire() throws InterruptedException {lock.lock();try {while (true) {refill();if (tokens.get() > 0) {tokens.decrementAndGet();return;}// 计算需要等待的时间(毫秒)long now = System.currentTimeMillis();long timeUntilRefill = 1000 / rate; // 下一次补充令牌的时间间隔long waitTime = Math.max(0, lastRefillTime + timeUntilRefill - now);// 等待直到有新的令牌补充或超时notEmpty.await(waitTime, TimeUnit.MILLISECONDS);}} finally {lock.unlock();}}/*** 根据时间差补充令牌*/private void refill() {long now = System.currentTimeMillis();long timeElapsed = now - lastRefillTime;// 计算应该补充的令牌数long tokensToAdd = (timeElapsed * rate) / 1000; // 毫秒转秒if (tokensToAdd > 0) {lastRefillTime = now;long newTokens = Math.min(tokens.get() + tokensToAdd, capacity);tokens.set(newTokens);// 唤醒所有等待线程notEmpty.signalAll();}}public static void main(String[] args) throws InterruptedException {TokenBucket bucket = new TokenBucket(2, 5); // 每秒2个令牌,最多存5个for (int i = 0; i < 10; i++) {bucket.acquire();System.out.println("Request " + (i + 1) + " processed.");}}
}

⚙️ 与漏桶算法的区别(Guava 的 RateLimiter 使用的是平滑化的令牌桶)

对比项令牌桶漏桶
控制方式控制请求是否能拿取令牌控制请求流出的速度
流量特性允许突发流量强制平滑输出
实现复杂度简单较复杂
应用场景API限流、网络带宽控制需要严格控制输出速率的系统

🛠 实际应用

  • Spring Cloud Gateway / Zuul:做网关限流
  • Nginx:基于令牌桶实现请求限速
  • Guava RateLimiter:使用了改进版的令牌桶算法
  • 分布式系统限流:结合 Redis 实现分布式令牌桶

✅ 总结

令牌桶算法是一种非常实用的限流机制,具有以下优点:

  • 能够限制请求的平均速率
  • 支持一定的突发流量
  • 实现简单,性能好

在实际开发中,推荐结合使用如 Guava 的 RateLimiter 或 Spring Cloud Gateway 的限流组件,但在理解其背后原理(如令牌桶)之后,你可以根据业务需求进行定制化开发。

http://www.dtcms.com/wzjs/418153.html

相关文章:

  • 手机版网站怎么做的百度收录情况
  • 淄博建网站网站更新seo
  • 自己的网站怎么做优化百度官网下载安装
  • 学校校园网站建设网站优化排名公司哪家好
  • 网站如何做微信支付江苏企业网站建设
  • 阿里云建站文章搜索在哪里推广自己的产品
  • wordpress整站密码访问优化分析
  • 什么是b2c电子商务模式提高seo排名
  • 门户网站建设的必要性品牌整合营销传播
  • 手机做任务赚钱网站网络销售挣钱吗
  • 学院网站开发竞争对手分析网上在线看视频为什么卡
  • 建立网上商城应考虑哪些问题免费seo网站诊断免费
  • xampp wordpress 建站竞价托管推广公司
  • 电商货源网站大专网络营销专业好不好
  • 企业做网站哪个最好网络热词有哪些
  • 重庆住房城乡建设厅网站推广营销平台
  • 企业做自己的网站要注意什么百度推广一个月费用
  • 做汽配的 哪一个网站比较好海淀区seo搜索引擎优化企业
  • 潍坊市网站制作优化网站哪个好
  • 网站制作常用代码免费下载百度软件
  • 站群seo微信小程序开发教程
  • 网站建设哪个公司做得好杭州优化seo公司
  • 成都建站优化公司长沙全网推广
  • 中国移动官方网站官网app推广渠道商
  • 怎样在一个虚拟服务器里做两个网站厦门人才网个人会员
  • 上海城隍庙门票多少钱一张做seo排名好的公司
  • 做唯品客网站的感想网站综合排名信息查询
  • 网站开发后端语言有哪些seo是什么意思的缩写
  • 外贸网站如何做推广网页代码大全
  • mip织梦手机网站模板电脑培训学校哪家最好