File size: 1,917 Bytes
ec41d51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
"""
负载均衡器 - Round Robin + 自动故障转移
"""
from typing import Optional
from datetime import datetime, timedelta
from account_manager import account_manager
from models import Account


class LoadBalancer:
    """智能负载均衡器"""
    
    def __init__(self):
        self.cooldown_duration = 60  # 默认冷却时间(秒)
        self.max_retries = 3
    
    async def get_next_account(self) -> Optional[Account]:
        """获取下一个可用账号"""
        return await account_manager.get_next_token()
    
    def mark_account_error(self, account_id: str, error_code: int, error_msg: str = ""):
        """
        标记账号错误,根据错误类型决定是否冷却
        - 429: Too Many Requests - 立即冷却
        - 400: Bad Request - 可能是请求格式问题,不冷却
        - 401: Unauthorized - Token 失效,冷却
        - 403: Forbidden - 配额耗尽,长时间冷却
        """
        account_manager.update_account_stats(account_id, success=False, error=error_msg)
        
        if error_code == 429:
            # 速率限制,冷却 60 秒
            account_manager.set_account_cooldown(account_id, 60)
            print(f"账号 {account_id} 触发速率限制,冷却 60 秒")
        elif error_code == 401:
            # Token 失效,冷却 30 秒(等待刷新)
            account_manager.set_account_cooldown(account_id, 30)
            print(f"账号 {account_id} Token 失效,冷却 30 秒")
        elif error_code == 403:
            # 配额耗尽,冷却 5 分钟
            account_manager.set_account_cooldown(account_id, 300)
            print(f"账号 {account_id} 配额耗尽,冷却 5 分钟")
    
    def mark_account_success(self, account_id: str):
        """标记请求成功"""
        account_manager.update_account_stats(account_id, success=True)


# 全局单例
load_balancer = LoadBalancer()