#node.js #discord.js
Вопрос:
Я только что разработал бота для добавления ролей пользователю, который начинает потоковую передачу на моем сервере. Когда я протестировал бота на изолированном сервере с несколькими каналами и пользователями, бот отреагировал мгновенно. Но теперь я настроил своего бота на своем основном сервере Discord примерно с 25 каналами и около ~500 пользователями, и теперь время отклика составляет более пяти минут, прежде чем я увижу, что он добавляет или удаляет роль.
Я подключаюсь через гигабит FIOS и работаю на I9 с оперативной памятью DDR4 4266 МГц.
Когда я впервые запускаю сервер узлов, я замечаю, что задержка намного меньше, однако все еще очень медленные ответы примерно на минуту или две, прежде чем он добавит или удалит роли. Если я позволю серверу работать в течение десяти минут, то время отклика составит около пяти минут, прежде чем он добавит роль. Я не знаю, продолжает ли это ухудшаться с течением времени. Но что может быть причиной этой задержки? Я сразу вижу, как мой статус пользователя меняется на потоковый (фиолетовая точка) в списке онлайн-пользователей, но мой бот discord не знает об этом в течение очень долгого времени!
Это мой код, я изо всех сил старался его оптимизировать, но я только учился Discord.js уже около недели, и я все еще очень незнаком с этим:
// require the discord.js module
const Discord = require('discord.js');
// create a new Discord client
const client = new Discord.Client();
let role = '';
client.once('ready', () => {
const myGuild = client.guilds.cache.get('123456789123456789');
role = myGuild.roles.cache.find(role => role.name === 'streaming');
console.log('Ready!');
});
client.on("presenceUpdate", (oldPresence, newPresence) => {
if (!newPresence.activities){ return false; }
newPresence.activities.forEach(activity => {
if (activity.type == "STREAMING") {
//console.log(`${newPresence.user.tag} is streaming at ${activity.url}.`);
newPresence.member.roles.add(role)
} else {
newPresence.member.roles.remove(role)
};
});
});
// login to Discord with your app's token
client.login('123456789123456789.123456789.123456789123456789');
Может кто-нибудь, пожалуйста, объяснить, почему мой бот становится таким вялым? Это почти непригодно для использования и немного обескураживает.
Ответ №1:
Значение maxListeners по умолчанию равно 10, и, возможно, стоит изучить возможность установки этого значения выше.
Кроме того, мне любопытно, есть ли утечка памяти в вашем приложении. Это похоже на это из-за вялости, которая ощущается с течением времени.
Попробуйте использовать инструмент профилирования, например Clinic.js для мониторинга состояния приложения с течением времени.
Комментарии:
1. Я протестировал Clinic и увидел, что загрузка памяти продолжает расти бесконечно, что помогло мне в дальнейшем диагностировать причину утечки памяти. Кроме того, я увеличил количество максимальных списков, как вы рекомендуете, и я верю, что это тоже немного помогло. Мой бот теперь прекрасно работает! Большое спасибо!