Golang实战:利用Atomic和轮询机制实现任务排队和并发流量控制

在一次开发大模型应用的工程化过程中,我们碰到一个问题,开源的模型核心代码是用Python写的,有自己的一套并发管理和排队机制,而模型一次只能处理一个生成任务,生成的时间也很长,在A10上,需要几秒钟到几十秒处理一个请求,就会导致在Python的锁上排队的其他请求被不断的阻塞。

因为团队的主要开发语言是Golang,我们使用Golang开发了一个调度程序,大模型生成任务的请求先先提交到Golang服务,经过排队和流量控制,再转发到运行在本机的Python的程序处理。

图片

专门为每个部署的Python应用实例,配对启动一个Golang调度程序,相当于在不修改Python源代码的情况下,配置了一套Agent,可以实现对Python程序的扩展,独立的实现很多功能,例如运行统计、数据上报、状态检查、还有请求和响应的转发处理,可以为架构带来更大的灵活性,还可以配合服务端的调度程序和配置,控制客户端的行为。

以上是为什么采用这种方案的架构思考,下面的文章,重点介绍在客户端Agent的实现过程中,通过Atomic采用等机制,实现了任务排队和无锁化可控的流量控制机制。

实现思路

  1. 使用atomic包:通过atomic包实现对共享变量的原子操作,避免数据竞争。

  2. 轮询机制:通过轮询方式检查并处理队列中的请求,确保每次只处理一个任务。

  3. 超时机制:在轮询过程中计时,如果一个任务等待时间过长,直接返回错误,避免任务堆积。

  4. 队列管理:维护一个队列,记录当前排队的任务,如果队列满了,拒绝新请求

示例代码


package main

import (
  "context"
  "fmt"
  "net/http"
  "sync"
  "sync/atomic"
  "time"

  "github.com/google/uuid"
)

const (
  DispatchCode_Success = iota + 1
  DispatchCode_TooManyRequest
  DispatchCode_WaitTooLong
  DispatchCode_Restartin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值