ChatGPT-Go实现多key负载均衡
Go

ChatGPT-Go实现多key负载均衡

多Key环境下的代理尝试

4分钟阅读

前言

目前chatGPT无疑仍然是目前市面上众多生成式AI模型中的领头羊,不仅在生成速度与质量上都十分出色,而且也有着很完整的开发文档,开发者可以很方便的使用sdk直接调用api进行更多不同场景业务的实现。

但是目前对于国内的用户却不太友好,不仅在网络环境上由于GFW先被卡了一关,OpenAI对帐号的严格风控也使得顺利使用困难重重,好在网上各路神仙大显神通,可以以极低的价格购买一批API keys进行早期的程序测试,在程序完成后再采用正式的key进行上线。

免费key的问题

但是对于免费key来说,有两个问题比较致命,一是最多只有5美金的试用额度,如果不分配均匀很容易会侧重消耗某个key的余额,另外便是每分钟的请求速率只有每分钟3条的限制。

部署后端的问题

因客观原因,后端服务只能部署在国内云服务器上,因此墙内访问openAI的 api 接口也是不小的挑战。

需要解决的问题

  1. 多 key 的动态分配调用,在外部调用层只需修改 base_url 而无需进行更多的配置
  2. 后端部署在国内服务器上,需要解决访问 api 的问题。

国内服务器访问 api

在查找资料后,选择了阿里云的云函数进行 api 的转发。

https://github.com/Ice-Hazymoon/openai-scf-proxy/blob/master/README-aliyun.md

在搭建完成后,只需在代码中指定 api 的地址为阿里云的云函数地址即可。

实测云函数地区选择新加坡🇸🇬,延迟在 500ms 之内,与直接海外服务器访问延迟相差不大。

负载均衡算法

核心思想是分为 步:

  1. 从数据库/缓存中获取全部可用的 key
  2. 从 key 列表中获取使用次数最少的一个 key
  3. 尝试使用 key 发起 api 请求

(请求成功)记录key 当前分钟剩余可用请求次数与可用字符

(请求失败)进行重试逻辑判断

重试算法

采用通道阻塞与计时器的方式进行重试的尝试,重试后如果仍不成功则慢慢加大每次重试的间隔时间,最大程度减少 panic 与错误传递给调用方的可能。

定义对应结构体数据结构

最终运行效果

在日志中可以清晰的看到每一个 key 的具体使用情况,同时可以看到重置限制时间的倒计时。

完整代码

后话

在这套系统上线后,在 GPT 模型的前期验证中剩下了一大笔开销,也减少了调用方的编写各种重试逻辑的难度。

相关文章