问题描述
当我尝试使用discord.js在discord机器人上进行分片时出现此问题。每个分片(至少在process
模式下)都有自己的程序执行,这意味着不同的分片实际上是独立的机器人。我的机器人功能之一是要求用户在服务器和DM中使用命令。问题在于,所有DM都发送到单个分片,因此来自不同分片上服务器的任何用户的命令似乎都已损坏,因为尽管服务器的分片可以正确跟踪所有内容,但DM的分片仍在跟踪不同的服务器集,看不到任何数据。
我对分片还很陌生,我认为解决此问题的最佳方法是处理我在导入到index.js
的模块中跟踪的所有信息,然后将必要的部分导入每个bot.js
子进程分片,因此所有数据都合并到一个位置,并且每个分片都可以访问它。但是,无论如何设置,当我尝试将信息从index.js
(分片管理器)导入bot.js
(在每个分片上运行的bot的代码)时,我都会不断收到奇怪的承诺拒绝,没有堆栈跟踪)。
这一定是对子进程和父进程之间导入的某种限制,但是我还没有找到任何关于此的信息。有谁知道如何使导入在这里正常工作,或者有其他方法可以集中处理信息,以便每个分片都可以访问它?
解决方法
这就是我最初在做的事情,它为每个子进程提供了自己的信息集。我想我不是很清楚这个问题,但这是实时创建的信息和数据,因此每个进程将拥有完全不同的数据集,因为它们处理的是不同的服务器。我需要的是一种在所有子进程中保持跟踪的方式,以便它们都可以访问相同的信息,并且可以全部操纵所述信息。
然后您要使用client.shard.broadcastEval()
。您可以使用以下方法从所有客户端缓存中获取公会属性:
const getServer = async (guildID) => {
// try to get guild from all the shards
const req = await client.shard.broadcastEval(`this.guilds.cache.get("${guildID}")`);
// return Guild or null if not found
return req.find(res => !!res) || null;
}
Example by ZiNc#2032
在以下链接中了解有关分片的更多信息: