Se o seu bot do Discord está conectado a um grande número de servidores e você percebe que ele está lento, sem resposta ou falhando ao conectar, o problema pode ser que ele excedeu os limites de conexão do gateway do Discord. O Discord impõe um limite rígido de quantos servidores uma única conexão de bot pode gerenciar de forma eficiente. Este artigo explica o que é sharding, por que seu bot precisa dele quando atinge cerca de 2.500 servidores e fornece um guia passo a passo claro para implementar sharding usando discord.js. Você aprenderá como configurar seu bot para dividir a carga de trabalho em várias conexões, chamadas shards, e como testar se a configuração funciona corretamente.
Principais Conclusões: Configuração de Sharding para Bot do Discord
- Gateway Intents do Discord > Guild Members Intent: O sharding é necessário quando seu bot está em mais de 2.500 servidores para permanecer dentro dos limites de taxa do Discord.
- discord.js ClientOptions > shards: Defina a propriedade shards como ‘auto’ para permitir que o discord.js calcule o número correto de shards automaticamente.
- Client.shard.broadcastEval: Use este método para enviar comandos ou buscar dados em todos os shards a partir de um único local.
Por que o Sharding é Necessário para o Bot do Discord
O Discord limita o número de servidores que uma única conexão de bot pode atender. Esse limite é de aproximadamente 2.500 servidores por conexão de gateway. Quando seu bot entra em mais de 2.500 servidores, a API do Discord começará a rejeitar conexões ou limitar as requisições do seu bot. O sharding resolve isso dividindo seu bot em vários processos separados, cada um lidando com um subconjunto de servidores. Cada shard mantém sua própria conexão WebSocket com o Discord, permanecendo abaixo do limite de servidores por conexão. O sharding também melhora o desempenho porque cada shard processa apenas eventos de seus servidores designados, reduzindo o uso de memória e CPU por processo. Sem sharding, um bot em 5.000 servidores simplesmente pararia de funcionar depois de ultrapassar o limite de 2.500.
Como Funciona o Limite de Gateway do Discord
A API de Gateway do Discord atribui a cada bot um ID de sessão único. Quando seu bot se conecta, o Discord verifica quantos guilds o bot está. Se a contagem exceder 2.500, o Discord envia um evento GUILD_CREATE para cada guild, mas a conexão fica instável e pode ser encerrada. O sharding informa ao Discord que seu bot está usando várias conexões, e o Discord então distribui os guilds uniformemente entre essas conexões. A API também fornece uma propriedade shard no payload de identify que informa ao Discord qual shard esta conexão representa.
Quando Você Precisa Começar a Usar Sharding
Você deve implementar o sharding antes que seu bot atinja 2.500 servidores. Esperar até depois de atingir o limite pode causar tempo de inatividade e erros de conexão. Muitos desenvolvedores de bot ativam o sharding assim que o bot atinge 1.500 servidores para se preparar para o crescimento. A documentação do Discord recomenda sharding para qualquer bot em mais de 2.500 servidores. Se seu bot usa intents de gateway que exigem acesso privilegiado, como o intent de Membros do Guild, o sharding se torna obrigatório em 2.500 servidores porque esses intents aumentam a carga em uma única conexão.
Passos para Configurar Sharding no discord.js
Estas instruções assumem que você está usando discord.js versão 13 ou 14. O processo de sharding envolve criar um arquivo separado de gerenciador de shards que inicia seu arquivo principal do bot várias vezes.
- Crie um Arquivo de Gerenciador de Shards
Crie um novo arquivo chamadoindex.jsna raiz do seu projeto do bot. Este arquivo será o ponto de entrada do seu bot, substituindo seu arquivo principal original. Escreva o seguinte código:const { ShardingManager } = require('discord.js');
const manager = new ShardingManager('./bot.js', {
token: 'SEU_TOKEN_DO_BOT',
totalShards: 'auto'
});
manager.on('shardCreate', shard => console.log(`Shard ${shard.id} iniciado`));
manager.spawn();
SubstituaSEU_TOKEN_DO_BOTpelo token real do seu bot. A configuraçãototalShards: 'auto'instrui o discord.js a calcular o número correto de shards com base na contagem de guilds do seu bot. - Mova o Código do Seu Bot para um Arquivo Separado
Renomeie seu arquivo original do bot parabot.js. Este arquivo deve conter a configuração do seu client, listeners de eventos e manipulação de comandos. O gerenciador de shards iniciará várias instâncias deste arquivo. Certifique-se de que seu arquivobot.jsnão chameclient.login()diretamente, pois o gerenciador de shards lida com o login automaticamente. - Atualize as Opções do Seu Client
Embot.js, modifique seu construtorClientpara incluir a propriedadeshards. Esta propriedade informa a cada instância qual shard ela é. Para discord.js v13 e v14, defina também comoshards: 'auto'. Exemplo:const client = new Client({
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],
shards: 'auto'
});
Se você usar uma contagem personalizada de shards, definashardscom o ID específico do shard e a contagem total, mas ‘auto’ é mais simples para a maioria dos bots. - Lide com o Acesso a Dados Entre Shards
Quando seu bot é fragmentado, cada shard tem seu próprio cache de guilds, canais e usuários. Para acessar dados de outro shard, useclient.shard.broadcastEval(). Por exemplo, para obter a contagem total de guilds em todos os shards:const guildCount = await client.shard.broadcastEval(c => c.guilds.cache.size);
const total = guildCount.reduce((acc, count) => acc + count, 0);
Este método envia uma função para cada shard e coleta os resultados. - Teste Sua Configuração de Sharding
Execute seu arquivoindex.js. Você deve ver mensagens de log para cada shard que iniciar, como “Shard 0 iniciado” e “Shard 1 iniciado”. Se você tiver menos de 2.500 servidores, o discord.js ainda criará pelo menos um shard. Verifique se seu bot responde a comandos e se eventos comoguildCreatefuncionam corretamente. Useclient.shard.countpara ver quantos shards estão ativos.
Problemas Comuns Após Ativar o Sharding
Comandos Param de Funcionar em Alguns Servidores
Se seus comandos de barra ou comandos de mensagem funcionam apenas em alguns servidores, o problema provavelmente é que seu código de registro de comandos é executado apenas em um shard. Registre comandos globais usando client.application.commands.set() dentro de um evento ready, mas certifique-se de que seja executado apenas uma vez. Use client.shard.broadcastEval para verificar se o shard atual é o primeiro shard (shard 0) e registre os comandos apenas lá. Alternativamente, registre comandos fora do gerenciador de shards usando um script separado que use a API REST diretamente.
Uso de Memória Aumenta Inesperadamente
Cada shard é executado como um processo Node.js separado, então o uso de memória multiplica pelo número de shards. Se seu bot tinha 100 MB de memória antes do sharding, com 5 shards ele usará aproximadamente 500 MB. Para reduzir a memória, minimize os dados em cache desativando intents desnecessários e usando partials apenas quando necessário. Considere usar cache externo como Redis para dados entre shards que não precisam estar na memória em todos os shards.
Loops de Reconexão de Shard
Se um shard fica desconectando e reconectando, seu token do bot pode ser inválido ou a contagem de shards pode estar mal calculada. Verifique se seu token está correto e se você não está excedendo os limites de taxa do Discord. Se você definir totalShards manualmente para um número muito baixo para sua contagem de guilds, o Discord pode rejeitar a conexão. Sempre use 'auto' a menos que você tenha um motivo específico para definir um número personalizado.
Comparação de Sharding de Bot do Discord: Contagem Manual vs Automática de Shards
| Item | Contagem Manual de Shards | Contagem Automática de Shards |
|---|---|---|
| Configuração | Você define totalShards com um número fixo, como 5 |
O discord.js calcula a contagem de shards a partir da sua contagem de guilds |
| Escalabilidade | Requer atualizações manuais quando seu bot cresce | Ajusta-se automaticamente à medida que seu bot entra em mais servidores |
| Risco de Erros | Alto se você escolher o número errado | Baixo porque a biblioteca consulta a API do Discord para a contagem recomendada |
| Melhor Para | Bots com uma contagem de guilds estável e conhecida | Bots que estão crescendo ativamente ou têm contagens de guilds imprevisíveis |
O sharding é um requisito para qualquer bot do Discord que atenda mais de 2.500 servidores. Seguindo os passos acima, você pode configurar o sharding com discord.js usando a opção de contagem automática de shards, que minimiza erros de configuração e mantém seu bot funcionando sem problemas à medida que cresce. Após ativar o sharding, use client.shard.broadcastEval para gerenciar dados entre shards e garantir que seus comandos sejam registrados globalmente. Para desempenho avançado, considere usar um gerenciador de processos como PM2 para reiniciar shards individuais sem afetar todo o bot.