我目前正在使用node-telegram-bot-api 运行一个电报机器人。 但现在项目变得越来越大,越来越多的用户正在使用我的机器人。 因此,当我不得不重新部署我的应用程序而许多人仍在访问时,我遇到了一些困难。 我尝试使用 pm2 运行多个集群,然后使用 pm2 重新加载在零停机时间内优雅地重新启动我的应用程序。
但是后来我收到了来自电报的错误:
error: [polling_error] {"code":"ETELEGRAM","message":"ETELEGRAM: 409 Conflict: terminated by other getUpdates request; make sure that only one bot instance is running"}
我认为 telegram 不会在同一服务器中提供多个实例。 遇到这样的问题有什么解决办法吗?
即使您可以运行脚本两次,用户在向机器人发送命令时也会得到两次答案。 你有两个选择:
要使用 PM2 在多个集群中运行 Telegram 机器人,您需要设置 Node.js 应用程序以支持集群。然后,PM2 可以生成应用程序的多个实例,以利用所有可用的 CPU 核心。这是分步指南:
更新您的集群机器人代码: 修改您的 Telegram 机器人代码以支持集群。这是一个使用
cluster
模块的简单示例:
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
const TelegramBot = require('node-telegram-bot-api');
if (cluster.isMaster) {
// Fork workers for each CPU core
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died`);
});
} else {
const bot = new TelegramBot('YOUR_BOT_TOKEN', { polling: true });
bot.on('message', (msg) => {
// Handle messages
console.log('Received message:', msg.text);
});
}
安装PM2: 如果您还没有安装 PM2,请全局安装:
npm install -g pm2
使用 PM2 启动您的机器人: 使用 PM2 启动您的机器人:
pm2 start your-bot-file.js -i max
将
your-bot-file.js
替换为机器人脚本的文件名。 -i max
标志指示 PM2 创建与 CPU 核心数量一样多的实例。
管理和监控您的机器人: 使用 PM2 命令来管理和监控您的机器人实例:
pm2 list
:列出正在运行的进程。pm2 stop <app_name_or_id>
:停止特定的机器人实例。pm2 delete <app_name_or_id>
:删除特定机器人实例。pm2 scale <app_name_or_id> <num_instances>
:缩放机器人的实例数量。例如,要停止特定的机器人实例,您可以运行:
pm2 stop your-bot-file-0
将
your-bot-file-0
替换为您要停止的机器人实例的实际名称或 ID。
此设置允许您的 Telegram 机器人跨多个集群运行,利用所有可用的 CPU 核心来获得更好的性能和可扩展性。根据应用程序的需求调整代码中的实例数量和集群逻辑。