在一次开发大模型应用的工程化过程中,我们碰到一个问题,开源的模型核心代码是用Python写的,有自己的一套并发管理和排队机制,而模型一次只能处理一个生成任务,生成的时间也很长,在A10上,需要几秒钟到几十秒处理一个请求,就会导致在Python的锁上排队的其他请求被不断的阻塞。
因为团队的主要开发语言是Golang,我们使用Golang开发了一个调度程序,大模型生成任务的请求先先提交到Golang服务,经过排队和流量控制,再转发到运行在本机的Python的程序处理。

专门为每个部署的Python应用实例,配对启动一个Golang调度程序,相当于在不修改Python源代码的情况下,配置了一套Agent,可以实现对Python程序的扩展,独立的实现很多功能,例如运行统计、数据上报、状态检查、还有请求和响应的转发处理,可以为架构带来更大的灵活性,还可以配合服务端的调度程序和配置,控制客户端的行为。
以上是为什么采用这种方案的架构思考,下面的文章,重点介绍在客户端Agent的实现过程中,通过Atomic采用等机制,实现了任务排队和无锁化可控的流量控制机制。
实现思路
-
使用atomic包:通过atomic包实现对共享变量的原子操作,避免数据竞争。
-
轮询机制:通过轮询方式检查并处理队列中的请求,确保每次只处理一个任务。
-
超时机制:在轮询过程中计时,如果一个任务等待时间过长,直接返回错误,避免任务堆积。
-
队列管理:维护一个队列,记录当前排队的任务,如果队列满了,拒绝新请求
示例代码
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

最低0.47元/天 解锁文章
1169

被折叠的 条评论
为什么被折叠?



