ChatGPT-Go实现多key负载均衡
多Key环境下的代理尝试
前言
目前chatGPT无疑仍然是目前市面上众多生成式AI模型中的领头羊,不仅在生成速度与质量上都十分出色,而且也有着很完整的开发文档,开发者可以很方便的使用sdk直接调用api进行更多不同场景业务的实现。
但是目前对于国内的用户却不太友好,不仅在网络环境上由于GFW先被卡了一关,OpenAI对帐号的严格风控也使得顺利使用困难重重,好在网上各路神仙大显神通,可以以极低的价格购买一批API keys进行早期的程序测试,在程序完成后再采用正式的key进行上线。
免费key的问题
但是对于免费key来说,有两个问题比较致命,一是最多只有5美金的试用额度,如果不分配均匀很容易会侧重消耗某个key的余额,另外便是每分钟的请求速率只有每分钟3条的限制。
部署后端的问题
因客观原因,后端服务只能部署在国内云服务器上,因此墙内访问openAI的 api 接口也是不小的挑战。
需要解决的问题
- 多 key 的动态分配调用,在外部调用层只需修改 base_url 而无需进行更多的配置
- 后端部署在国内服务器上,需要解决访问 api 的问题。
国内服务器访问 api
在查找资料后,选择了阿里云的云函数进行 api 的转发。
https://github.com/Ice-Hazymoon/openai-scf-proxy/blob/master/README-aliyun.md
在搭建完成后,只需在代码中指定 api 的地址为阿里云的云函数地址即可。
实测云函数地区选择新加坡🇸🇬,延迟在 500ms 之内,与直接海外服务器访问延迟相差不大。
负载均衡算法
核心思想是分为 步:
- 从数据库/缓存中获取全部可用的 key
- 从 key 列表中获取使用次数最少的一个 key
- 尝试使用 key 发起 api 请求
(请求成功)记录key 当前分钟剩余可用请求次数与可用字符
(请求失败)进行重试逻辑判断
重试算法
采用通道阻塞与计时器的方式进行重试的尝试,重试后如果仍不成功则慢慢加大每次重试的间隔时间,最大程度减少 panic 与错误传递给调用方的可能。
定义对应结构体数据结构
最终运行效果
在日志中可以清晰的看到每一个 key 的具体使用情况,同时可以看到重置限制时间的倒计时。
完整代码
后话
在这套系统上线后,在 GPT 模型的前期验证中剩下了一大笔开销,也减少了调用方的编写各种重试逻辑的难度。