Encontranos en redes
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?