Discord机器人删除历史消息速度过慢,求性能优化方案
优化方案
- 优先调用
bulkDelete处理符合时限的消息
官方提供的bulkDelete单次最多可删除100条14天内的消息,处理效率远高于单条删除。你可以先将拉取到的消息按发布时间拆分,符合时限的先走批量删除接口,剩下的超期消息再单独处理,能减少80%以上的单删请求量。 - 控制并发请求数避免触发限流
你原来的代码是同时发起所有单删请求,Discord API有严格的速率限制,大量并发请求会被强制阻塞甚至返回错误。可以将待删除的超期消息拆分成小批次,每批次并发处理5-10个删除请求,批次间加1s左右的等待,既提高效率又不会触发限流。 - 改写异步逻辑避免回调地狱
用async/await替代嵌套的.then回调,逻辑更清晰,也方便统计删除进度和处理异常。
优化后代码示例
// 14天对应的毫秒数 const TWO_WEEKS = 14 * 24 * 60 * 60 * 1000; let numDeleted = 0; async function deleteMessages() { try { const chan = await bot.channels.fetch(message.channel.id); const msgs = await chan.messages.fetch({ limit: args[0] }); const validMsgs = msgs.filter(msg => !msg.deleted); message.send(`Deleting ${validMsgs.size} messages (lesser of request or existing message history)`); // 拆分可批量删除的14天内消息 const bulkDeletable = validMsgs.filter(msg => Date.now() - msg.createdTimestamp < TWO_WEEKS); const needSingleDelete = validMsgs.filter(msg => Date.now() - msg.createdTimestamp >= TWO_WEEKS); // 批量处理符合要求的消息 if (bulkDeletable.size > 0) { const deleted = await chan.bulkDelete(bulkDeletable, true); numDeleted += deleted.size; } // 批次处理超期消息的单删,每批处理10条 const batchSize = 10; const msgArr = Array.from(needSingleDelete.values()); for (let i = 0; i < msgArr.length; i += batchSize) { const batch = msgArr.slice(i, i + batchSize); // 并发处理当前批次 await Promise.allSettled( batch.map(msg => msg.delete() .then(() => numDeleted++) .catch(err => console.error(err)) ) ); // 批次间等待1s避免触发限流 await new Promise(resolve => setTimeout(resolve, 1000)); } } catch (err) { console.error(err); } } deleteMessages();
如果需要进一步提速,可以适当调大批次大小(最高不要超过20),同时缩短批次间隔,注意监控API返回的429限流错误,根据返回的retry_after参数动态调整等待时间即可。
内容的提问来源于stack exchange,提问作者G-Force
相关产品推荐
相关产品推荐

