AI Engineering Academy · Aula

Balanceamento de carga e estratégias com várias chaves

Implemente balanceamento de carga round-robin e ponderado entre várias chaves e contas de API para ampliar sua margem até o limite de taxa e reduzir picos de latência p99.

Aula 2 de 413 etapas

Balanceamento de carga e estratégias com várias chaves é uma aula grátis de AI Engineering Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Engineering Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Engineering Academy inclui 4 aulas no total.

Por que uma única chave de API não é suficiente

Uma única chave de API da OpenAI tem um limite de taxa fixo, medido em solicitações por minuto (RPM) e tokens por minuto (TPM). No Tier 1, GPT-4o permite 500 RPM e 30.000 TPM. Em uma aplicação de produção com centenas de usuários simultâneos, uma única chave atingirá esses limites constantemente. Várias chaves de API multiplicam proporcionalmente a margem disponível.

Criando várias chaves de API

Você pode criar várias chaves de API em uma única organização da OpenAI ou criar várias contas da OpenAI (cada uma faturada separadamente). Armazene cada chave na configuração do ambiente e trate-as como um pool. Mantenha as chaves em um gerenciador de segredos, como AWS Secrets Manager ou HashiCorp Vault, em vez de colocá-las no código-fonte ou em arquivos .env enviados ao controle de versão.

import os

API_KEYS = [
    os.environ['OPENAI_KEY_1'],
    os.environ['OPENAI_KEY_2'],
    os.environ['OPENAI_KEY_3'],
    os.environ['OPENAI_KEY_4'],
]

# Total effective RPM = 500 * 4 = 2000 RPM
# Total effective TPM = 30000 * 4 = 120000 TPM

Balanceamento de carga round-robin

O round-robin distribui as solicitações uniformemente entre todas as chaves, alternando entre elas na ordem definida. É simples de implementar e garante que cada chave processe aproximadamente a mesma carga ao longo do tempo. Use um contador seguro para threads ou um inteiro atômico para evitar que duas solicitações simultâneas escolham a mesma chave. O round-robin funciona bem quando todas as chaves têm limites de taxa idênticos.

import itertools
import threading
from openai import OpenAI

class RoundRobinPool:
    def __init__(self, keys: list):
        self._clients = [OpenAI(api_key=k) for k in keys]
        self._cycle = itertools.cycle(range(len(self._clients)))
        self._lock = threading.Lock()

    def get_client(self) -> OpenAI:
        with self._lock:
            idx = next(self._cycle)
        return self._clients[idx]

pool = RoundRobinPool(API_KEYS)
client = pool.get_client()

Balanceamento de carga ponderado

O balanceamento de carga ponderado atribui às chaves de nível mais alto (com limites de taxa maiores) uma parcela maior do tráfego, proporcional à capacidade delas. Se a chave A for Tier 3 (10.000 RPM) e a chave B for Tier 1 (500 RPM), a chave A deverá receber aproximadamente 95% das solicitações. O balanceamento ponderado impede que chaves de nível inferior se tornem gargalos quando combinadas com chaves de nível superior.

import random

class WeightedPool:
    def __init__(self, key_configs: list):
        # key_configs = [{'key': '...', 'weight': 10}, ...]
        self._clients = [OpenAI(api_key=c['key']) for c in key_configs]
        self._weights = [c['weight'] for c in key_configs]

    def get_client(self) -> OpenAI:
        return random.choices(self._clients, weights=self._weights, k=1)[0]

pool = WeightedPool([
    {'key': os.environ['OPENAI_KEY_TIER3'], 'weight': 20},
    {'key': os.environ['OPENAI_KEY_TIER1'], 'weight': 1},
])

Acompanhando o estado do limite de taxa por chave

A API da OpenAI retorna cabeçalhos de limite de taxa em cada resposta: x-ratelimit-remaining-requests e x-ratelimit-remaining-tokens. Acompanhe esses cabeçalhos por chave para saber quais estão perto de se esgotar. Quando uma chave informar menos de 10 solicitações restantes no minuto atual, encaminhe temporariamente o tráfego para longe dela para evitar erros 429 antes que ocorram.

class SmartPool:
    def __init__(self, keys: list):
        self._clients = [OpenAI(api_key=k) for k in keys]
        self._remaining = {i: 500 for i in range(len(keys))}  # initial RPM

    def get_best_client(self):
        # Pick key with most remaining capacity
        best_idx = max(self._remaining, key=lambda i: self._remaining[i])
        return self._clients[best_idx], best_idx

    def update_remaining(self, idx: int, response_headers: dict):
        remaining = int(response_headers.get('x-ratelimit-remaining-requests', 0))
        self._remaining[idx] = remaining

Lidando com erros 429 de limite de taxa

Quando uma chave retornar um erro 429, retire-a imediatamente do pool pelo período especificado no cabeçalho Retry-After (normalmente 60 segundos). Marque-a como em resfriamento e encaminhe todo o tráfego para as chaves restantes. Quando o período de resfriamento terminar, restaure a chave ao pool. Isso evita falhas em cascata, nas quais novas tentativas na mesma chave pioram a situação.

import time
from openai import RateLimitError

class CooldownPool:
    def __init__(self, keys: list):
        self._clients = [(OpenAI(api_key=k), None) for k in keys]  # (client, cooldown_until)

    def get_available_clients(self):
        now = time.time()
        return [
            (i, c) for i, (c, until) in enumerate(self._clients)
            if until is None or until <= now
        ]

    def mark_cooling(self, idx: int, retry_after: int = 60):
        client, _ = self._clients[idx]
        self._clients[idx] = (client, time.time() + retry_after)
        print(f'Key {idx} cooling down for {retry_after}s')

Usando o OpenRouter como multiplexador

O OpenRouter é um serviço de proxy que disponibiliza centenas de modelos por meio de um único endpoint de API compatível com a OpenAI. Ao encaminhar as solicitações pelo OpenRouter, você obtém automaticamente balanceamento de carga entre várias contas de provedores subjacentes, fallback para provedores alternativos e acesso a modelos de código aberto como opções de reserva. O acréscimo de custo é pequeno diante da simplicidade operacional oferecida.

from openai import OpenAI

# OpenRouter uses the same OpenAI SDK interface
client = OpenAI(
    api_key=os.environ['OPENROUTER_API_KEY'],
    base_url='https://openrouter.ai/api/v1'
)

response = client.chat.completions.create(
    model='openai/gpt-4o',  # OpenRouter model name format
    messages=[{'role': 'user', 'content': prompt}]
)
# Automatic failover if OpenAI is down

Monitorando a saúde das chaves com métricas

Acompanhe métricas por chave, incluindo solicitações enviadas, erros 429 recebidos e tempo de resfriamento na última hora. Uma chave com uma taxa alta de erros 429 precisa de redução de tráfego ou de uma atualização de nível. Exponha essas métricas em um endpoint /metrics no formato do Prometheus para que seu sistema de monitoramento possa alertar quando alguma chave estiver atingindo os limites continuamente.

from dataclasses import dataclass, field
from collections import defaultdict

@dataclass
class KeyMetrics:
    requests_sent: int = 0
    rate_limit_errors: int = 0
    total_tokens_used: int = 0
    cooldown_count: int = 0

class MetricPool:
    def __init__(self, keys: list):
        self._clients = [OpenAI(api_key=k) for k in keys]
        self._metrics = [KeyMetrics() for _ in keys]

    def report(self):
        for i, m in enumerate(self._metrics):
            error_rate = m.rate_limit_errors / max(m.requests_sent, 1)
            print(f'Key {i}: {m.requests_sent} req, {error_rate:.1%} 429 rate')

Distribuição geográfica das chaves

Se seus usuários estiverem espalhados pelo mundo, considere manter chaves de API separadas por região geográfica e encaminhar as solicitações para a chave mais próxima do usuário. A redução do tempo de ida e volta da rede melhora o TTFT. Implante um balanceador de carga leve em cada região (AWS Lambda@Edge ou Cloudflare Worker) que selecione a chave apropriada e faça o proxy da solicitação, protegendo suas chaves contra exposição aos clientes.

REGIONAL_KEYS = {
    'us-east': os.environ['OPENAI_KEY_US_EAST'],
    'eu-west': os.environ['OPENAI_KEY_EU_WEST'],
    'ap-southeast': os.environ['OPENAI_KEY_AP'],
}

def get_key_for_region(user_region: str) -> str:
    # Default to us-east if region unknown
    return REGIONAL_KEYS.get(user_region, REGIONAL_KEYS['us-east'])

Testando seu balanceador de carga

Escreva um teste de carga que envie 100 solicitações simultâneas pelo seu pool de balanceamento e meça a distribuição, as taxas de erro e os percentis de latência. Verifique se nenhuma chave processa mais do que sua parcela proporcional e se os erros 429 ficam abaixo de 0,1%. Use asyncio.gather ou uma ferramenta como Locust para simular a carga simultânea que seu sistema de produção realmente enfrentará.

import asyncio
import time

async def load_test(pool, concurrency=100, total=1000):
    sem = asyncio.Semaphore(concurrency)
    results = []

    async def one_request():
        async with sem:
            client = pool.get_client()
            start = time.perf_counter()
            try:
                await client.chat.completions.create(
                    model='gpt-4o-mini',
                    messages=[{'role': 'user', 'content': 'Ping'}],
                    max_tokens=5
                )
                results.append(('ok', time.perf_counter() - start))
            except Exception as e:
                results.append(('error', str(e)))

    await asyncio.gather(*[one_request() for _ in range(total)])
    ok = [r for r in results if r[0] == 'ok']
    print(f'Success rate: {len(ok)/total:.1%}')
    return results

Escolhendo a estratégia de balanceamento correta

Adapte sua estratégia de balanceamento à estrutura dos limites de taxa. Use round-robin quando todas as chaves tiverem limites de nível idênticos e o tráfego estiver distribuído uniformemente. Use balanceamento ponderado quando as chaves tiverem limites de nível diferentes. Use roteamento consciente da saúde (ignorando chaves próximas do esgotamento) quando precisar minimizar erros 429 sob tráfego em rajadas. Na maioria dos sistemas de produção, o roteamento consciente da saúde com recuo exponencial oferece o melhor equilíbrio entre simplicidade e resiliência.

# Strategy selection guide:
# Scenario A: 4 keys all Tier 2 (same limits)
#   -> Round-robin: simple, even distribution
#
# Scenario B: 1 Tier 3 key + 3 Tier 1 keys
#   -> Weighted: Tier 3 gets 10x weight
#
# Scenario C: Variable traffic with burst periods
#   -> Health-aware: track remaining headers, skip near-limit keys
#
# Scenario D: Multi-region, latency-sensitive
#   -> Geographic: regional keys, route by user location

Verificação rápida

Teste sua compreensão das estratégias de balanceamento de carga para APIs de LLM.

Recapitulação da lição

Nesta lição, você aprendeu que: o balanceamento round-robin e o balanceamento ponderado distribuem o tráfego entre várias chaves de API para multiplicar a margem dos limites de taxa; o acompanhamento do resfriamento evita erros 429 em cascata ao remover temporariamente as chaves limitadas; e o OpenRouter oferece uma opção de multiplexação gerenciada com fallback automático. A seguir, implementaremos provedores de fallback e disjuntores.

Grátis para começar

Aprenda Python com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
30
Aulas
120

Perguntas Frequentes

A aula “Balanceamento de carga e estratégias com várias chaves” é grátis?

Sim — o texto completo de “Balanceamento de carga e estratégias com várias chaves” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Engineering Academy, atualize para CoddyKit PRO. O curso de AI Engineering Academy inclui 4 aulas no total.

O que vou aprender em “Balanceamento de carga e estratégias com várias chaves”?

Implemente balanceamento de carga round-robin e ponderado entre várias chaves e contas de API para ampliar sua margem até o limite de taxa e reduzir picos de latência p99. Você pratica AI Engineering Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar AI Engineering Academy?

Nenhuma experiência prévia é necessária. AI Engineering Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Balanceamento de carga e estratégias com várias chaves”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de AI Engineering Academy?

Sim. Cada aula de AI Engineering Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Medindo a latência de LLM: TTFT e TPOT
  2. Balanceamento de carga e estratégias com várias chaves
  3. Provedores alternativos e disjuntores
  4. Orçamentos de tempo limite e degradação controlada
← Voltar para AI Engineering Academy