返回顶部
首页 > 资讯 > 后端开发 > GO >golangAPI请求队列的实现
  • 682
分享到

golangAPI请求队列的实现

2024-04-02 19:04:59 682人浏览 独家记忆
摘要

目录概要实现思路使用方法概要 在调用第三方 api 的时候, 基本都有访问限速的限制条件. 第三方的 API 有多个的时候, 就不太好控制访问速度, 常常会导致 Http 429(T

概要

在调用第三方 api 的时候, 基本都有访问限速的限制条件. 第三方的 API 有多个的时候, 就不太好控制访问速度, 常常会导致 Http 429(Too Many Requests) 然后就会有一段时间的禁止访问.

为了应对这种限速的情况, 通过一个简单的请求队列来控制访问的速度, 之后基本没遇到过 HTTP 429 了.

实现思路

首先, 每个请求包装成一个 RequestParam 的 struct, 其中包含请求的地址,类型,参数以及 response 的 channel.

发送请求的时候, 只要将 RequestParam 放入请求队列中即可, 请求完成后, 将 response 放入对应的 channel 中.

整个代码实现很简单:

   package util
   
   import (
     "fmt"
   
     apiclient "gitee.com/wangyubin/gutils/api_client"
     "gitee.com/wangyubin/gutils/logger"
   )
   
  // request 包含的内容
  type RequestParam struct {
    Api     string
    Method  string
    JSONReq interface{}
    Resp    chan []byte
  }
  
  // 请求队列, 本质是一个channel
  type RequestQueue struct {
    Queue chan RequestParam
  }
  
  var queue *RequestQueue
  
  // 获取队列
  func GetQueue() *RequestQueue {
    return queue
  }
  
  // 初始化队列
  func InitRequestQueue(size int) {
    queue = &RequestQueue{
      Queue: make(chan RequestParam, size),
    }
  }
  
  // 将请求放入队列
  func (rq *RequestQueue) Enqueue(p RequestParam) {
    rq.Queue <- p
  }
  
  // 请求队列服务, 一直等待接受和处理请求
  func (rq *RequestQueue) Run() {
    lg := logger.GetLogger()
    for p := range rq.Queue {
      var resp []byte
      var err error
      switch p.Method {
      case "GET":
        resp, err = apiclient.Getjson(p.Api, p.JsonReq)
      case "POST":
        resp, err = apiclient.PostJson(p.Api, p.JsonReq)
      default:
        err = fmt.Errorf("Wrong type of METHOD(%s)\n", p.Method)
      }
  
      if err != nil {
        lg.Err(err).Msg("access api error: " + p.Api)
        continue
      }
      if p.Resp != nil {
        p.Resp <- resp
        close(p.Resp)
      }
    }
  
    lg.Info().Msg("request queue finished!")
  }

这里的请求是用了我自己封装的 apiclient, 可以根据实际情况替换.

在我的应用场景里, 只要 api 顺序访问就不会出现 HTTP 429 了, 如果这样觉得速度太快的的话, 可以尝试在 Run() 函数中加入一些时间间隔.

  func (rq *RequestQueue) Run() {
    lg := logger.GetLogger()
    for p := range rq.Queue {
       time.Sleep(1 * time.Second)
       // ... 省略的代码 ...
    }
  
    lg.Info().Msg("request queue finished!")
  }

使用方法

使用很简单, 首先启动, 然后每个调用的地方将 RequestParam 放入队列并等待 response 即可.

启动队列服务 

func main() {
      // init request queue and start queue service
      util.InitRequestQueue(100)
      queue := util.GetQueue()
      defer close(queue.Queue)
      Go queue.Run()
  
      // 其他启动代码
  }

使用队列服务

   func Request(param1 string, param2 int) error {
   api := "http://xxxx.com"
   api = fmt.Sprintf("%s?period=%s&size=%d", api, param1, param2)
   
    queue := util.GetQueue()
    param := util.RequestParam{
      Api:    api,
      Method: "GET",
     Resp:   make(chan []byte, 1),
   }
   queue.Enqueue(param)
  
   var respData struct {
     Status string       `json:"status"`
     Data   []model.Data `json:"data"`
   }
   var err error
   for resp := range param.Resp {
     err = json.Unmarshal(resp, &respData)
     if err != nil {
       lg.Err(err).Msg("unmarshal json error")
       return err
     }
   }
  
   fmt.Println(respData) 
   return  err
  }

到此这篇关于golang API请求队列的实现的文章就介绍到这了,更多相关golang API请求队列内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: golangAPI请求队列的实现

本文链接: https://lsjlt.com/news/147165.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • golangAPI请求队列的实现
    目录概要实现思路使用方法概要 在调用第三方 API 的时候, 基本都有访问限速的限制条件. 第三方的 API 有多个的时候, 就不太好控制访问速度, 常常会导致 HTTP 429(T...
    99+
    2024-04-02
  • js实现axios限制请求队列
    目录背景是:会造成什么情况呢?背景是: 在实际开发中,可能会遇到网络问题或者查询量比较大的情况,上一个请求还没有完成,用户就发起了下一个请求。 会造成什么情况呢? 但是同一个请求多次...
    99+
    2024-04-02
  • AJAX中怎么实现请求队列
    AJAX中怎么实现请求队列,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。AJAX队列很简单,创建一个数组存储请求队列,数组中每一项又是一个请求...
    99+
    2024-04-02
  • java怎么使用队列处理请求
    在Java中,可以使用Queue接口的实现类来处理请求。Queue是Java集合框架中定义的一个接口,表示队列的数据结构。其中常用的...
    99+
    2023-08-18
    java
  • java队列实现方法(顺序队列,链式队列,循环队列)
    双向顺序队列ArrayDeque和双向链式队列LinkedList,JDK已经包含,在此略。ArrayDeque包括顺序栈和顺序队列,LinkedList包含链式栈和链式队列。ArrayDeque和LinkedList都是线程不安全的。Pr...
    99+
    2023-05-30
    java 队列 顺序
  • golang 实现队列
    队列是一种先进先出(FIFO)的数据结构,常用于解决计算机程序中的各种问题。在 Go 语言中,可以使用标准库中的 container 包来实现队列数据结构。创建队列要创建一个队列,我们需要使用 container 包中的 list 库来创建...
    99+
    2023-05-16
  • Java 循环队列/环形队列的实现流程
    之前,我们使用链表实现了基础队列,链接放在这里可以去康康哟 Java栈和基础队列的实现详解 之所以没有选择数组来实现,是因为每有一个元素出队,数组中所有剩下的元素都需要向前移动一次,...
    99+
    2024-04-02
  • java中如何实现队列的入队与出队
    首先要定义几个变量与数组:a:表示队列的数组rear:表示队列尾,这里初始化为0(入队一个元素下标就往后移动一位)front:表示队列头,同样初始化为0(出队一个元素下标就往后移动一位)maxsize:最大下标,这里初始化为4,但是队列只能...
    99+
    2022-01-29
    java教程 java 队列 入队 出队
  • Java 单向队列及环形队列的实现原理
    目录队列的特点图解实现过程:优化解决——环形队列实现思路环形队列各步骤及各方法实现讲解最后:队列的特点 1.可以使用数组和链表两种方式来实现。 2.遵循先入先出(FIFO)的规则,即...
    99+
    2024-04-02
  • Flutter 队列任务的实现
    目录前言队列添加任务进队列移除队列指定任务判断是否包含对应任务执行队列任务任务条件添加任务时加入条件执行任务前判断条件是否满足使用和总结前言 在电商的应用中,最常见的就是在首页或完成...
    99+
    2024-04-02
  • Go http请求排队处理实战示例
    目录一、http请求的顺序处理方式二、http请求的异步处理方式--排队处理工作单元队列消费者协程完整代码总结一、http请求的顺序处理方式 在高并发场景下,为了降低系统压力,都会使...
    99+
    2024-04-02
  • redisstream实现消息队列的实践
    目录redis 实现消息对列4中方法发布订阅list 队列zset 队列Stream 队列基本命令xadd 生产消息读取消息xgroup 消费者组xreadgroup 消费消息Pen...
    99+
    2022-11-13
    redis stream 消息队列 redis 消息队列
  • java实现循环队列
    循环队列的优点普通队列出队操作开销大:在出队操作时,索引为0后面的所有元素,都需要往前移动一位,元素越多,消耗的时间也越多,时间复杂度为O(N)。循环队列的逻辑:当元素较少时(tail位置在front后面),循环队列与普通队列出队操作一样,...
    99+
    2017-09-10
    java入门 java 循环队列
  • redis实现简单队列
    在工作中,时常会有用到队列的场景,比较常见的用rabbitMQ这些专业的组件,官网地址是:http://www.rabbitmq.com,重要的是官方有.net的客户端,但是如果对rabbitMQ不熟悉的话...
    99+
    2022-06-04
    队列 简单 redis
  • ios实现简易队列
    本文实例为大家分享了ios实现简易队列的具体代码,供大家参考,具体内容如下 满足一些特殊需求 接口部分(队列支持需求) #import <Foundation/Founda...
    99+
    2022-05-18
    ios 队列
  • golang消息队列实现
    Golang是一种开源的编程语言,它适用于创建高性能的网络应用程序和消息队列等分布式系统。在这篇文章中,我们将探讨如何使用Golang来实现一个消息队列。什么是消息队列?在分布式系统中,应用程序通常需要在不同的节点之间共享数据。消息队列是用...
    99+
    2023-05-15
  • .Net实现延迟队列
    目录介绍使用场景方案Redis过期事件配置控制台订阅WebApi中订阅RabbitMq延迟队列生产消息消费消息其他方案介绍 具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就...
    99+
    2024-04-02
  • javascript实现双端队列
    本文实例为大家分享了javascript实现双端队列的具体代码,供大家参考,具体内容如下 1.双端队列 双端队列是一种允许我们同时从前端和后端添加和移除元素的特殊队列 2.双端队列...
    99+
    2024-04-02
  • golang如何实现队列
    golang可以使用标准库中的”container/list“包实现队列:1、使用import关键字导入包;2、定义函数”main“;3、通过”list.New()“函数创建了一个新的队列q;4、使用”PushBack()“方法向队列中添加...
    99+
    2023-12-12
    Golang golang实现队列
  • Python双端队列deque的实现
    目录前言基本用法填充线程安全旋转限制双端队列大小前言 双端队列deque支持从任意一端增加和删除元素。其中,栈和队列就是双端队列的退化形式,它们的输入输出被限制在某一端。 基本用法 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作