使用 Upstash 实现请求和令牌限流

news/2025/1/3 17:22:32/

一、引言

在现代分布式系统和网络应用中,限流是确保系统稳定性、可用性和公平性的关键技术之一。当系统面临高并发请求时,如果不加以限制,可能会导致资源耗尽、服务雪崩等严重后果。Upstash 是一个强大的云服务平台,提供了便捷高效的请求和令牌限流功能,帮助开发者轻松应对流量高峰,保障系统的正常运行。本次技术分享将深入探讨如何使用 Upstash 实现请求和令牌限流。

二、Upstash 概述

Upstash 是一个基于云的平台,它提供了一系列的后端开发工具和服务,其中包括分布式缓存(如 Redis 兼容的缓存服务)、消息队列以及本文重点关注的限流功能。Upstash 的优势在于其简单易用的 API、无需管理服务器基础设施的便利性以及与多种编程语言和框架的良好兼容性,使得开发者能够快速集成限流功能到他们的应用中,无论是 Web 应用、移动后端还是微服务架构。

三、请求限流

(一)基本概念

请求限流是指对单位时间内的客户端请求数量进行限制,以防止过多的请求对服务器资源造成压力,导致系统性能下降甚至崩溃。常见的请求限流策略包括固定窗口、滑动窗口、令牌桶和漏桶算法等。Upstash 主要使用令牌桶算法来实现请求限流,该算法通过以固定速率向桶中添加令牌,每个请求需要获取一个令牌才能被处理,如果桶中没有令牌则请求被拒绝或延迟,从而有效地控制请求的速率。

(二)使用 Upstash 实现请求限流的步骤

  1. 创建 Upstash 账号并获取 API 密钥

    • 访问 Upstash 官方网站,注册一个账号。注册完成后,在用户控制台中找到并生成用于访问 Upstash 服务的 API 密钥,这些密钥将用于在应用中与 Upstash 进行交互认证。
  2. 选择合适的编程语言和 Upstash 客户端库

    • Upstash 支持多种编程语言,如 JavaScript(Node.js)、Python、Java、Go 等。根据项目所使用的编程语言,选择对应的 Upstash 客户端库并将其添加到项目的依赖中。以 Node.js 为例,可以使用npm install upstash-redis来安装 Upstash 的 Redis 客户端库,用于与 Upstash 的服务进行通信。
  3. 在应用中初始化 Upstash 客户端

    • 在应用的代码中,使用获取到的 API 密钥来初始化 Upstash 客户端。以下是 Node.js 的示例代码:

const { Redis } = require('upstash-redis');const redis = new Redis({url: 'YOUR_UPSTASH_REDIS_URL',token: 'YOUR_UPSTASH_API_TOKEN'
});

这里的YOUR_UPSTASH_REDIS_URLYOUR_UPSTASH_API_TOKEN需要替换为实际在 Upstash 控制台获取到的值。

  1. 定义限流规则并应用到请求处理逻辑中
    • 使用 Upstash 的令牌桶算法来定义限流规则。例如,以下代码设置了一个每秒允许 10 个请求的限流策略:

const rateLimiter = redis.limit('my-rate-limiter').window(1).max(10);app.get('/my-api-endpoint', async (req, res) => {const { success } = await rateLimiter.check(req.ip);if (success) {// 处理请求的业务逻辑res.send('Request processed successfully');} else {res.status(429).send('Too many requests, please try again later');}
});

在上述代码中,rateLimiter.check(req.ip)用于检查来自特定 IP 地址的请求是否在限流范围内。如果请求被允许(successtrue),则继续处理业务逻辑并返回响应;否则,返回429 Too Many Requests状态码给客户端,提示请求过于频繁。

四、令牌限流

(一)基本概念

令牌限流与请求限流类似,但更加灵活,它基于令牌的概念来控制对特定资源或操作的访问。每个操作或资源都被分配一定数量的令牌,客户端在执行操作之前需要获取相应的令牌,如果没有足够的令牌,则无法进行操作。这种方式可以用于限制对某些敏感或昂贵资源的访问频率,例如 API 调用、数据库写入操作等,确保资源的合理使用和公平分配。

(二)使用 Upstash 实现令牌限流的步骤

  1. 与请求限流的前期步骤相同

    • 完成 Upstash 账号注册、获取 API 密钥以及在应用中选择并初始化相应的客户端库,如上述请求限流部分所述。
  2. 定义令牌桶和获取令牌的逻辑

    • 以下是使用 Node.js 和 Upstash 实现令牌限流的示例代码:

const { Redis } = require('upstash-redis');const redis = new Redis({url: 'YOUR_UPSTASH_REDIS_URL',token: 'YOUR_UPSTASH_API_TOKEN'
});// 创建一个令牌桶,初始令牌数量为 50,每秒补充 10 个令牌
const tokenBucket = redis.tokenBucket('my-token-bucket', 50, 10);async function consumeToken() {const { tokens } = await tokenBucket.consume();if (tokens >= 0) {// 有足够的令牌,可以执行受限制的操作console.log('Token consumed, performing operation...');} else {console.log('Not enough tokens, operation blocked');}
}// 模拟多个请求同时尝试获取令牌执行操作
for (let i = 0; i < 10; i++) {consumeToken();
}

在这段代码中,tokenBucket.consume()方法用于尝试从令牌桶中获取一个令牌。如果返回的tokens值大于等于 0,则表示获取令牌成功,可以执行相应的操作;否则,说明令牌不足,操作被阻止。同时,令牌桶会按照每秒补充 10 个令牌的速率自动补充令牌,以维持令牌的可用性。

五、总结与注意事项

使用 Upstash 实现请求和令牌限流能够有效地保护系统免受高并发流量的冲击,确保系统的稳定性和可靠性。在实际应用中,需要根据系统的业务需求和性能指标合理地设置限流参数,如请求速率限制、令牌桶的初始数量和补充速率等,以达到最佳的限流效果。同时,要注意对限流策略的监控和调整,随着业务的发展和流量的变化,可能需要适时地优化限流规则,以适应新的情况。此外,虽然 Upstash 提供了方便的限流功能,但也要结合其他系统优化措施(如缓存、负载均衡等)来进一步提升系统的整体性能和可用性。通过合理地运用 Upstash 的限流功能,开发者可以更加自信地应对复杂的网络环境和高并发场景,为用户提供稳定、高效的服务体验。


http://www.ppmy.cn/news/1559959.html

相关文章

arXiv-2024 | 吴琦教授新作!SAME:基于状态自适应专家混合模型的通用语言引导视觉导航

作者&#xff1a;Gengze Zhou, Yicong Hong, Zun Wang, Chongyang Zhao, Mohit Bansal, Qi Wu 单位&#xff1a;阿德莱德大学&#xff0c;Adobe Research&#xff0c;北卡罗来纳大学教堂山分校&#xff0c;新南威尔士大学悉尼分校 论文链接&#xff1a;SAME: Learning Generi…

C++通透讲解设计模式:开闭原则(1)

开闭原则 开闭原则在大部分书籍中是这样描述的&#xff1a; 软件实体对扩展开放&#xff0c;对修改关闭 这句话有一些模糊不清&#xff0c;接下来我将用比较通俗的方式讲解它 “开”和“闭”的故事 接下来&#xff0c;我们用分类书为比喻&#xff0c;帮助你理解这一思想。 …

应用层1——C/S、P2P、DNS域名系统

目录 一、网络应用模型 1、C/S 2、p2p模型 二、域名解析系统DNS 1、为什么有DNS系统&#xff1f; 2、域名的特点 3、DNS域名系统原理 4、递归查询、迭代查询 5、常用的根域名与顶级域名 一、网络应用模型 1、C/S 客户/服务器模型 客户请求服务&#xff0c;服务器提供…

HTML——38.Span标签和字符实体

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>span标签和字符实体</title><style type"text/css">h1{text-align: center;}p{text-indent: 2em;}span{color: red;}</style></head><…

神经网络-DenseNet

DenseNet&#xff08;密集连接卷积神经网络&#xff0c;Densely Connected Convolutional Networks&#xff09;是一种深度卷积神经网络结构&#xff0c;由 Gao Huang 等人于 2017 年提出。它的基本思路与 ResNet&#xff08;残差网络&#xff09;一致&#xff0c;但 DenseNet …

【深度学习基础之多尺度特征提取】多尺度图像增强(Multi-Scale Image Augmentation)是如何在深度学习网络中提取多尺度特征的?附代码

【深度学习基础之多尺度特征提取】多尺度图像增强&#xff08;Multi-Scale Image Augmentation&#xff09;是如何在深度学习网络中提取多尺度特征的&#xff1f;附代码 【深度学习基础之多尺度特征提取】多尺度图像增强&#xff08;Multi-Scale Image Augmentation&#xff0…

Llama 3 后训练(三)

目录 4. 后训练 4.1 建模 图表解读 4.1.1 聊天对话格式 4.1.2 奖励建模 4.1.3 监督微调&#xff08;Supervised Finetuning&#xff09; 4.1.4 直接偏好优化&#xff08;Direct Preference Optimization&#xff09; 4.1.5 模型平均&#xff08;Model Averaging&#x…

git clone 超时

git clone 超时 参考 https://blog.csdn.net/qq_45906972/article/details/142214187?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-142214187-blog-137158358.235v43pc_blog_bottom_relevance_base8&spm1001.2101.3001.…