Rate LimitsAPIOptimización4 min de lectura

Manejar rate limits de la API de Discord

Entender el sistema de buckets, manejar respuestas 429, implementar colas y buenas prácticas.


¿Qué son los rate limits?

Discord limita la cantidad de requests que podés hacer a su API para evitar abuso. Si excedés el límite, recibís un error 429 (Too Many Requests) y tu bot queda bloqueado temporalmente.

Cómo funciona el sistema de buckets

Cada endpoint tiene su propio bucket de rate limit:

terminal
Headers de respuesta:
X-RateLimit-Limit: 5          # Requests permitidos
X-RateLimit-Remaining: 3      # Requests restantes
X-RateLimit-Reset: 1672531200 # Timestamp de reset
X-RateLimit-Bucket: abc123    # ID del bucket

Límites globales importantes:

  • 50 requests/segundo por bot (global)
  • 5 mensajes/5 segundos por canal
  • Slash commands: 200 creates/día (global), ilimitado por guild

Manejar 429 automáticamente

discord.js maneja rate limits internamente, pero podés monitorearlos:

javascript
const { Client } = require('discord.js');

const client = new Client({ /* intents */ });

// Evento de rate limit
client.rest.on('rateLimited', (info) => {
  logger.warn('Rate limited', {
    route: info.route,
    timeout: info.timeToReset,
    limit: info.limit,
    method: info.method
  });
});

// Configurar reintentos
const { REST } = require('discord.js');
const rest = new REST({
  retries: 3,
  timeout: 15000
}).setToken(process.env.DISCORD_TOKEN);

Implementar una cola de mensajes

Para bots que envían muchos mensajes:

javascript
class MessageQueue {
  constructor() {
    this.queue = new Map(); // channelId -> messages[]
    this.processing = new Set();
  }

  async send(channel, content) {
    const channelId = channel.id;
    if (!this.queue.has(channelId)) {
      this.queue.set(channelId, []);
    }
    this.queue.get(channelId).push(content);

    if (!this.processing.has(channelId)) {
      this.processing.add(channelId);
      await this.processQueue(channel);
    }
  }

  async processQueue(channel) {
    const messages = this.queue.get(channel.id);
    while (messages.length > 0) {
      const content = messages.shift();
      await channel.send(content);
      await new Promise(r => setTimeout(r, 1100)); // 1 msg/seg safe
    }
    this.processing.delete(channel.id);
  }
}

Buenas prácticas

javascript
// ❌ Malo: enviar muchos mensajes seguidos
for (const user of users) {
  await channel.send(`Bienvenido ${user}`);
}

// ✅ Bueno: combinar en un solo mensaje o embed
const welcomeList = users.map(u => `• ${u}`).join('\n');
await channel.send(`**Bienvenidos:**\n${welcomeList}`);

// ✅ Bueno: usar bulk operations
await channel.bulkDelete(messages, true); // En vez de borrar uno por uno

Recomendaciones

  • Dejá que discord.js maneje los rate limits automáticamente
  • Monitoreá el evento rateLimited para detectar problemas
  • Combiná mensajes cuando sea posible
  • Usá colas para operaciones masivas
  • Cacheá datos en vez de hacer requests repetidos a la API

¿Te resultó útil esta guía?