- Inicio
- Guías
- Discord Bots
- Manejar rate limits de la API de Discord
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 bucketLí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 unoRecomendaciones
- Dejá que discord.js maneje los rate limits automáticamente
- Monitoreá el evento
rateLimitedpara 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?