在C#中如何合并API GET请求 实现控制器队列批量调用优化
多间隔文件夹统计请求队列设计方案
核心设计逻辑
采用延迟触发队列+批量执行缓冲区的两级结构,既满足不同文件夹的差异化触发间隔要求,又能将同时到期的请求聚合批量执行,降低HTTP请求开销。
具体实现步骤
- 首先定义请求任务基础结构,至少包含
folder_id(文件夹ID)、interval_ms(触发间隔)、next_trigger_time(下次触发时间戳)三个核心字段,用于任务调度判断 - 实现延迟调度队列,队列按
next_trigger_time升序排序,后台启动单调度协程,每秒扫描一次队列,捞出所有到期(next_trigger_time<=当前时间)的任务,将对应文件夹ID推入批量执行缓冲区,同时更新这些任务的next_trigger_time为当前时间+interval_ms后重新塞回延迟队列等待下次触发 - 批量执行缓冲区设置双触发阈值:批量数量上限(例如攒够20个ID就触发执行)、最长等待时间(例如最多等待500ms,没攒够数量也强制执行),避免低流量场景下请求长期阻塞不返回
- 执行批量请求时优先调用后端批量接口,将ID列表作为参数一次性查询;如果后端暂未提供批量接口,可采用HTTP/2多路复用并行发送多个
api/folders/{id}/count请求,性能比串行单请求提升40%以上
控制器层封装
控制器仅对外暴露两个极简方法:
AddTrack(folder_id, interval_ms):新增需要监控的文件夹,直接将任务推入延迟队列即可,重复ID自动更新间隔去重RemoveTrack(folder_id):移除不需要监控的文件夹,从延迟队列中删除对应任务
注意事项
- 任务去重逻辑必须前置:同一个folder_id如果已在队列中,直接更新触发间隔即可,禁止重复插入导致重复请求
- 失败请求单独处理:批量请求中调用失败的ID不要直接扔回延迟队列,单独存入小型重试队列,间隔1s重试2次仍失败则丢弃告警,避免影响正常任务调度
- 若对任务持久化有要求,可将监控的文件夹ID和对应间隔存入本地数据库,服务重启时自动加载所有任务到延迟队列,避免任务丢失
伪代码示例
// 任务结构体定义 type FolderCountTask struct { FolderID string IntervalMs int64 NextTriggerAt int64 } // 批量执行逻辑 func batchExecute(buffer []string) { // 调用批量接口示例 reqUrl := fmt.Sprintf("api/folders/count?ids=%s", strings.Join(buffer, ",")) resp, err := http.Get(reqUrl) if err != nil { // 处理失败重试逻辑 return } // 解析返回结果更新缓存 }
内容的提问来源于stack exchange,提问作者Paul Sukharev
相关产品推荐
相关产品推荐

