Categories
Tags
Ai 生成 API学习 API简化 api请求 API调用 best-practices Blogging Caching catchTag catchTags class CLI Config context Context Context.Tag CSS Customization Demo development DocC Docker dual API Effect effect Effect.Service Effect.succeed Example extension ffmpeg filterOrFail flatMap Fuwari gen generator grep hooks HTML HTTP响应 IDE自动补全 iOS javascript JavaScript Javascript Layer.effect Layer.provide Layers Linux Markdown Mock n8n Next.js ParseError pipe pokemon PostCSS process.env progress Promise promise provideService PWA react React React Hook Form React Query React Router react-native Scheduler Schema Schema.Class security Service Worker Services SSR state-management suspense Tagged Errors TaggedError TanStack Query TanStack Start tips tryPromise tsconfig TypeScript typescript Video VS Code vscode Web API Web Development yield yt-dlp Zod 不透明类型 二叉树 代码组织 任务调度 优先级 使用服务 依赖注入 依赖管理 值语义 入门教程 最佳实践 最小堆 函数式编程 函数组合 前端 前端开发 副作用 副作用控制 可视化 可组合性 可维护性 可访问性 命令行 响应过滤 多个错误 实现 实践指南 层 层依赖 层组合 工具链 并发控制 应用架构 延迟执行 开发技巧 开发教程 开源 异步处理 异步操作 异步编程 性能优化 手写系列 排序 接口设计 插件开发 数据结构 数据获取 数据解码 数据验证 无限滚动 日历 日志分析 服务 服务依赖 服务定义 服务实现 服务提供 测试 源码分析 状态管理 环境变量 生成器 离线支持 程序分离 算法 类型安全 类型定义 类型推断 类型系统 类定义 线性代码 组合 翻译 自动化 自定义错误 表单验证 记忆化 设计模式 语义化 运维 运行时验证 部分应用 配置 配置变量 配置服务 配置管理 重构 错误处理 错误定义 错误恢复 项目设置
544 words
3 minutes
并发请求控制实现原理与实践
1. 基础版本:不考虑响应的并发限制请求
NOTE并发限制请求是一个常见的性能优化需求,通过控制同时执行的请求数量来避免服务器过载和提高应用性能。
实现并发控制的核心在于两个关键点:
- 限制并发数的阈值
limit - 存储等待执行请求的队列
timerQueue
TIP实现思路:
- 使用队列存储超出限制的请求
- 维护当前执行中的请求数量
- 请求完成后自动从队列中取出新的请求执行
这个状态机的起点必然是从第一个请求开始的, 所以必然会执行, 当然后续再limit范围内的请求也会执行
当请求结束后,会判断timerQueue是否为空, 不为空的话, 就取出第一个请求执行
function createLimitRequest(limit: number) {
let timerQueue: Array<() => Promise<void>> = []
let count = 0;
function wookLoop() {
if (count >= limit) {
return;
}
if (timerQueue.length > 0) {
const task = timerQueue.shift();
if (task) {
count++;
task();
}
}
}
return function limitControl(fetch: () => Promise<void>) {
const task = async () => {
await fetch();
count--;
wookLoop();
}
timerQueue.push(task);
wookLoop();
}
}WARNING核心实现要点:
- 使用闭包保存队列和计数器状态
- 通过 async/await 处理异步请求
- 请求完成后自动触发下一个任务
2. 进阶版本:处理响应的并发限制请求
NOTE在实际应用中,我们不仅需要控制请求的并发数,还需要正确处理每个请求的响应结果。这需要我们在基础版本上增加响应处理机制。
这个版本的实现借鉴了 Promise 的特性:
- 通过 Promise 的 resolve 机制来传递响应结果
- 保持并发控制的同时确保响应数据的正确返回
TIP通过返回一个新的 Promise,我们可以:
- 控制请求的执行时机
- 获取请求的返回结果
- 维持并发控制的逻辑
wookLoop的实现保持不变, 主要是limitControl的实现返回个promise
function limitControl(fetch: () => Promise<void>) {
return new Promise(resolve){
const task = async () => {
const result = await fetch();
resolve(result);
count--;
wookLoop();
}
timerQueue.push(task);
wookLoop();
}
}效果预览