Skip to main content

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é.

avertissement

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.

  1. Dans votre répertoire src, créez un nouveau fichier bot.ts ; il sera utilisé pour instancier le bot en tant qu'application autonome avec quelques légères différences. Le DiscordModule ne peut pas être importé au sein de votre AppModule. 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 votre DiscordModule ou, alternativement, créer un SharedModule qui est importé à la fois dans votre AppModule et votre DiscordModule.
import { NestFactory } from '@nestjs/core';
import { DiscordModule } from './discord/discord.module';

async function bootstrap() {
await NestFactory.createApplicationContext(DiscordModule);
}

bootstrap();
info

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'
}
};
};
  1. Modifiez votre fichier main.ts pour créer une nouvelle instance de ShardingManager qui appelle votre fichier bot.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();
  1. Désormais, lorsque vous amorcez votre application, le contexte de votre bot.ts est créé sur un processus shardé.
astuce

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.