Sharding
Discord empêche votre application de bot de se connecter sans sharding une fois que vous atteignez l'échelle de 2 500 serveurs. Si vous ne prévoyez pas de créer une application de bot publique, vous pouvez ignorer cette section. Cependant, si vous créez une application de bot publique, il serait judicieux de garder le sharding à l'esprit, car il peut augmenter la complexité de votre application en raison du fonctionnement d'un processus shardé.
Si vous exécutez le bot dans le cadre d'un serveur web au sein de NestJS, alors, pour mettre en œuvre le sharding, vous devez comprendre que l'initialisation de necord au sein de votre processus de serveur HTTP ne sera pas une option viable. Nous allons donc devoir séparer les deux dans leurs propres processus indépendants. Cela ne signifie pas que vous ne pouvez pas partager du code entre les deux, simplement qu'ils s'exécuteront sur des processus différents. Vous pourriez considérer votre application « bot » comme une sorte de microservice.
- Dans votre répertoire
src, créez un nouveau fichierbot.ts; il sera utilisé pour instancier le bot en tant qu'application autonome avec quelques légères différences. LeDiscordModulene peut pas être importé au sein de votreAppModule. C'est parce que nous ne voulons aucun processus de bot sur des processus non shardés ; donc, si vous devez partager du code entre les deux, vous devriez importer les modules nécessaires dans votreDiscordModuleou, alternativement, créer unSharedModulequi est importé à la fois dans votreAppModuleet votreDiscordModule.
import { NestFactory } from '@nestjs/core';
import { DiscordModule } from './discord/discord.module';
async function bootstrap() {
await NestFactory.createApplicationContext(DiscordModule);
}
bootstrap();
You may also need to add a webpack.config.js file to your root directory which exports the bot.ts file as it's not automatically exported with the application due to how the bot.ts file is used within another process which webpack is unable to detect. You can use the following snippet to achieve this:
const Path = require('path');
module.exports = function (options) {
return {
...options,
entry: {
main: options.entry,
bot: Path.join(__dirname, 'src', 'bot.ts')
},
output: {
filename: '[name].js'
}
};
};
- Modifiez votre fichier
main.tspour créer une nouvelle instance deShardingManagerqui appelle votre fichierbot.js(et non l'extension .ts) ; spécifier une extension .ts provoquera des erreurs, car cela n'est exécuté qu'après que votre code a été transpilé en JavaScript. Vous pouvez utiliser l'extrait ci-dessous à titre d'exemple :
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as Path from 'path';
export async function bootstrap() {
const app = await NestFactory.create(AppModule);
const port = 80;
await app.listen(port);
const manager = new ShardingManager(Path.join(__dirname, 'bot.js'), {
token: 'secret'
});
manager.spawn();
manager.on('shardCreate', shard => {
shard.on('reconnecting', () => {
console.log(`Reconnecting shard: [${shard.id}]`);
});
shard.on('spawn', () => {
console.log(`Spawned shard: [${shard.id}]`);
});
shard.on('ready', () => {
console.log(` Shard [${shard.id}] is ready`);
});
shard.on('death', () => {
console.log(`Died shard: [${shard.id}]`);
});
shard.on('error', err => {
console.log(`Error in [${shard.id}] with : ${err} `);
shard.respawn();
});
});
}
bootstrap();
- Désormais, lorsque vous amorcez votre application, le contexte de votre
bot.tsest créé sur un processus shardé.
Si vous rencontrez d'autres problèmes et avez besoin d'héberger votre application de bot en cross-hosting, il vous suffit de remplacer le ShardingManager par d'autres paquets de sharding comme discord-hybrid-sharding, qui est requis pour le paquet discord-cross-hosting.