Sharding
O Discord impede que a aplicação de seu bot faça login sem fazer sharding uma vez que você chega numa escala de 2.500 servidores. Se você não planeja criar um bot público, então você pode ir em frente e ignorar esta seção. No entanto, se você estiver criando um bot público, Seria sensato manter o sharding em mente, pois isso pode aumentar a complexidade de sua aplicação devido à forma como funciona um processo fragmentado.
Se você estiver executando o bot como parte de um servidor web dentro do NestJS, então para implementar o compartilhamento você deve entender que inicializar o necord
dentro do processo do servidor HTTP não vai ser uma opção viável. Então vamos ter que dividir os dois em seus próprios processos independentes. Isso não significa que você não pode compartilhar o código entre os dois, então eles serão executados em processos diferentes. Você poderia considerar sua aplicação "bot" como um microsserviço.
- No diretório
src
, crie um arquivobot.ts
, esse arquivo será usado para instanciar o bot como uma aplicação autônoma com algumas pequenas diferenças. ODiscordModule
não pode ser importado dentro do seuAppModule
. Isso porque não queremos nenhum processo bot em processos não compartilhados, então se você precisa compartilhar o código entre os dois, você deve importar os módulos necessários para o seuDiscordModule
ou como alternativa, crie umSharedModule
que é importado para o seuAppModule
eDiscordModule
.
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'
}
};
};
- Modifique o seu arquivo
main.ts
para criar uma instância deShardingManager
que chama o arquivobot.js
(não a extensão .ts), especificando uma extensão .ts causará erros, pois ela é executada somente depois que seu código for transpilado em JavaScript. Você pode usar o snippet abaixo como um exemplo:
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(`Reconectando shard: [${shard.id}]`);
});
shard.on('spawn', () => {
console.log(`Criando shard: [${shard.id}]`);
});
shard.on('ready', () => {
console.log(` Shard [${shard.id}] está pronto`);
});
shard.on('death', () => {
console.log(`Shard: [${shard.id}] morreu`);
});
shard.on('error', err => {
console.log(`Erro em [${shard.id}] com: ${err} `);
shard.respawn();
});
});
}
bootstrap();
- Agora quando você inicia sua aplicação, seu contexto
bot.ts
é criado em um processo compartilhado.
Se você estiver enfrentando problemas adicionais e exija que seu aplicativo de hospedagem cruzada, então basta trocar o ShardingManager
para outros pacotes de compartilhamento, como o [discord-hybrid-sharding](https://github. om/meister03/discord-hybrid-sharding) que é necessário para o pacote discord-cross-hosting.