You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:24:04