AstrBot 负载均衡 Provider 插件
AstrBot 负载均衡 Provider 插件的第一个完整版本,支持多种负载均衡策略以及智能故障转移机制,旨在提高 AI 服务的可靠性和性能。
项目说明
这是一个为 AstrBot 设计的负载均衡插件,通过灵活的策略选择和智能的故障转移机制,提高 AI 服务的可用性和性能。项目采用模块化设计,便于后续扩展和维护。欢迎社区参与,共同完善这个插件!
功能特性
- 多种负载均衡策略:支持轮询、随机、加权、最少失败、最快响应等多种策略
- 智能故障转移:自动检测失败节点并切换到健康节点
- 健康检查机制:定期检查后端提供商的健康状态
- 动态配置:支持运行时动态调整负载均衡配置
- 探索与利用平衡:最快响应和最少失败策略,结合负载次数进行智能探索
- 响应度量:使用实际 tokens 数量计算吞吐量
安装
将插件放置在 AstrBot/data/plugins/ 目录下即可自动加载。
配置详解
基本配置项
| 配置项 | 类型 | 默认值 | 描述 |
|---|---|---|---|
lb_strategy |
string | random |
负载均衡策略 |
lb_weights |
object | {} |
权重配置 |
lb_health_check_interval |
string | "30" |
健康检查间隔(秒) |
负载均衡策略
1. 随机(Random)- random
- 随机选择提供商处理请求
- 简单高效的负载分配方式
2. 轮询(Round Robin)- round_robin
- 按顺序循环分配请求到不同的提供商
- 适用于各提供商性能相近的场景
3. 加权(Weighted)- weighted
- 根据配置的权重分配请求比例,采用高效权重区间算法
- 适用于提供商性能差异较大的场景
- 内在权重值很大时也能保持良好的性能和内存效率
4. 最少失败(Least Failure)- least_failure
- 优先选择失败率最低的提供商
- 智能地避免性能较差的节点
- 结合选择次数进行探索,避免过度依赖历史数据
5. 最快响应(Fastest)- fastest
- 优先选择响应时间最短的提供商
- 优化用户体验和响应速度
- 结合选择次数进行探索,避免过度依赖历史数据
负载均衡逻辑
普通请求处理流程
- 策略选择:根据配置的
lb_strategy选择对应的负载均衡算法 - 节点筛选:在非加权策略下,从健康节点中按故障转移链顺序筛选
- 请求分发:根据所选策略从可用节点中选择一个处理请求
- 统计更新:记录响应时间、成功率等指标
各策略实现细节
- 随机策略:使用 Python 的 random.choice 方法
- 轮询策略:在健康节点中按顺序循环选择
- 加权策略:基于权重区间算法进行选择,高效处理大权重值
- 最少失败:选择历史失败率最低的节点,结合选择次数进行探索
- 最快响应:选择吞吐量(tokens/秒)最高的节点,结合选择次数进行探索
故障转移逻辑
智能故障转移机制
在非加权策略下,故障转移遵循以下逻辑:
- 健康检查:定期评估各提供商的健康状态
- 节点排序:基于
lb_weights配置中定义的顺序(从权重配置中推导出故障转移顺序,按weight_node_1, weight_node_2...的顺序) - 策略应用:在健康节点中应用当前负载均衡策略
- 失败处理:当选择的节点失败时,在剩余健康节点中继续尝试
健康状态管理
- 成功标记:请求成功时,对应提供商被标记为健康
- 失败标记:请求失败时,根据失败率和连续失败次数评估健康状态
- 阈值设置:
- 失败率 > 50% 时标记为不健康
- 连续失败 >= 3 次且无成功记录时标记为不健康
故障转移流程
- 初始选择:基于策略从健康节点中选择一个节点
- 请求尝试:向选中的节点发送请求
- 失败处理:如节点失败,从剩余健康节点中按策略继续选择
- 链式回退:依次尝试所有健康节点直到成功或全部失败
加权策略特殊处理
在加权策略下:
- 不使用
lb_weights中定义的顺序作为故障转移顺序 - 权重配置 (
lb_weights) 仅用于负载分配权重计算 - 失败后在所有剩余健康提供商中按权重逻辑重新选择
- 使用高效权重区间算法,避免大权重值造成的性能问题
使用场景
1. 高可用性场景
- 配置多个提供商作为备份
- 使用故障转移链确保服务不中断
2. 性能优化场景
- 使用最快响应或最少失败策略
- 动态适应提供商性能变化
3. 资源利用优化场景
- 使用加权策略根据提供商能力分配负载
- 遫免单个提供商过载
注意事项
- 确保配置的提供商 ID 有效且可用
- 定期监控各提供商的健康状态和性能指标
- 根据实际需求选择合适的负载均衡策略
- 合理设置健康检查间隔以平衡资源消耗和故障检测速度
贡献
欢迎提交 Issue、Bug 报告和 Pull Requests!
- 如发现任何问题,请在 Issues 中提交
- 欢迎为功能改进和优化提交 Pull Requests
许可证
参见项目中的 LICENSE 文件。