Node.js 是否会成为 Discord 机器人的瓶颈?
Is there a point where Node.js becomes the bottleneck for a Discord bot?
我最近编写了一个 discord 机器人,一旦用户选择加入,它就可以跟踪用户在服务器上的参与度。我主要使用 Discord.js 框架编写它,它接受从 Discord [=17= 发出的事件] 当服务器的用户在特定条件下(消息发送、消息反应等)处于活动状态时
我如何判断 Node.js 的单线程特性何时(如果有的话)成为此应用程序的瓶颈?或者,我如何测试我的应用程序响应时间的速度以查看我的实际代码是否是低效部分?虽然应用程序的基于事件的特性似乎非常适合 Node,但我想更多地了解它背后的理论以及何时使用其他框架是个好主意。
正如您所说,nodejs 非常适合此类应用程序。因此,只要您的代码 运行 在具有相当 CPU 能力的机器上运行,您就会在很长一段时间内遇到瓶颈。使用一两个 vCPU 会 运行 没问题,但如果您的云提供商限制分配给您租用的虚拟机的 cpu,您的机器人可能跟不上工作量大。
如果您的事件处理程序使用数据库,这与 discord.js 一样有可能成为瓶颈。 Nodejs 本身可以毫不费力地处理数百个并发事件处理器(只要您的供应商不 throttle your CPU)。
如何知道您没有跟上事件的步伐?试试这个。每个事件都由一个看起来像这样的函数处理(您的代码风格肯定会有所不同,这只是一般的想法)。
execute(client) {
try {
await someOperation(client)
await someOtherOperation(client)
}
catch (err) {
/* handle the error */
}
}
您可以像这样为这些事件处理程序计时
execute(client) {
const startTime = Date.now()
try {
await someOperation(client)
await someOtherOperation(client)
}
catch (err) {
/* handle the error */
}
finally {
const elapsedTime = Date.now() - startTime
if (elapsedTime > 1000){ /*one second, you may want another value */
/* report it somehow */
}
}
这将跟踪超过一秒的事件处理程序。
如果您的机器人确实忙到需要重构,我怀疑您最好的方法是对您的应用程序进行分片;将一些客户端指向 nodejs 实例,将其他客户端指向另一个实例。
我最近编写了一个 discord 机器人,一旦用户选择加入,它就可以跟踪用户在服务器上的参与度。我主要使用 Discord.js 框架编写它,它接受从 Discord [=17= 发出的事件] 当服务器的用户在特定条件下(消息发送、消息反应等)处于活动状态时
我如何判断 Node.js 的单线程特性何时(如果有的话)成为此应用程序的瓶颈?或者,我如何测试我的应用程序响应时间的速度以查看我的实际代码是否是低效部分?虽然应用程序的基于事件的特性似乎非常适合 Node,但我想更多地了解它背后的理论以及何时使用其他框架是个好主意。
正如您所说,nodejs 非常适合此类应用程序。因此,只要您的代码 运行 在具有相当 CPU 能力的机器上运行,您就会在很长一段时间内遇到瓶颈。使用一两个 vCPU 会 运行 没问题,但如果您的云提供商限制分配给您租用的虚拟机的 cpu,您的机器人可能跟不上工作量大。
如果您的事件处理程序使用数据库,这与 discord.js 一样有可能成为瓶颈。 Nodejs 本身可以毫不费力地处理数百个并发事件处理器(只要您的供应商不 throttle your CPU)。
如何知道您没有跟上事件的步伐?试试这个。每个事件都由一个看起来像这样的函数处理(您的代码风格肯定会有所不同,这只是一般的想法)。
execute(client) {
try {
await someOperation(client)
await someOtherOperation(client)
}
catch (err) {
/* handle the error */
}
}
您可以像这样为这些事件处理程序计时
execute(client) {
const startTime = Date.now()
try {
await someOperation(client)
await someOtherOperation(client)
}
catch (err) {
/* handle the error */
}
finally {
const elapsedTime = Date.now() - startTime
if (elapsedTime > 1000){ /*one second, you may want another value */
/* report it somehow */
}
}
这将跟踪超过一秒的事件处理程序。
如果您的机器人确实忙到需要重构,我怀疑您最好的方法是对您的应用程序进行分片;将一些客户端指向 nodejs 实例,将其他客户端指向另一个实例。