使用 pm2 在多个集群中运行 telegram 机器人

问题描述 投票:0回答:2

我目前正在使用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 不会在同一服务器中提供多个实例。 遇到这样的问题有什么解决办法吗?

telegram telegram-bot pm2 node-telegram-bot-api
2个回答
1
投票

即使您可以运行脚本两次,用户在向机器人发送命令时也会得到两次答案。 你有两个选择:

  • 升级您的资源(RAM/CPU/...)
  • 使用主脚本处理传入消息,创建 API 并在 API 后端执行流程。

0
投票

要使用 PM2 在多个集群中运行 Telegram 机器人,您需要设置 Node.js 应用程序以支持集群。然后,PM2 可以生成应用程序的多个实例,以利用所有可用的 CPU 核心。这是分步指南:

  1. 更新您的集群机器人代码: 修改您的 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);
      });
    }
    
  2. 安装PM2: 如果您还没有安装 PM2,请全局安装:

    npm install -g pm2
    
  3. 使用 PM2 启动您的机器人: 使用 PM2 启动您的机器人:

    pm2 start your-bot-file.js -i max
    

    your-bot-file.js
    替换为机器人脚本的文件名。
    -i max
    标志指示 PM2 创建与 CPU 核心数量一样多的实例。

  4. 管理和监控您的机器人: 使用 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 核心来获得更好的性能和可扩展性。根据应用程序的需求调整代码中的实例数量和集群逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.