AWS 无服务器应用程序是否能够继续收听 IRC 频道?

Is AWS severless app able to keep listening to IRC channels?

我正在开发一个项目,使用 AWS serverless express 从 IRC 频道获取消息。 我使用了 node.js(v10) 和 node-irc 包。

它是这样工作的:我POST后台的频道名称,它会加入IRC频道并做某事。这是我的一些代码:

router.post('/message', function(req, res) {
  console.log(req.body);
  var channel_name = req.body.channel_name
  var channel_id = req.body.channel_id;
  var irc = require('irc')
      , logger =  function logger() {
            console.log(arguments);
        }
      , instance
      ;
    var channelTag = '#' + channel_name; 
    process.on('unhandledRejection', logger);
    process.on('uncaughtException',  logger);

    try {
        instance = new irc.Client('irc.server.name', 'username', {
            userName: 'username'
          , realName: 'realname'
          , password: 'pwd'
          , channels:[channelTag]
          , port: 6667
          , autoRejoin: true
          , autoConnect: false
          , secure: false
          , selfSigned: false
          , certExpired: false
          , stripColors: true
          , encoding: 'UTF-8'
          , debug: true
        });
        console.log('instance')
        instance.connect();
        instance
            .addListener('message', function (from, to, message) {
              console.log('log: ', message)
            });
    }
    catch (ex) {
        logger(ex);
    }
  console.log('mark', channel_name)
  res.send(channel_name)
})

当我 运行 在我自己的笔记本电脑上 (npm start) 时,它运行良好。它将控制台记录 IRC 消息。

但是当我使用SAM(AWS Serverless Application Model)和运行 sam local start-api在本地测试时,可能只有运行代码1秒,无法保持收听频道。

Fetching lambci/lambda:nodejs8.10 Docker container image......
2019-07-28 10:58:53 Mounting /Users/apple/Public/basic-starter-2 as /var/task:ro,delegated inside runtime container
START RequestId: dba68ff9-9cc8-194d-8aaf-8cf60770eb8c Version: $LATEST
2019-07-28T17:58:58.249Z        dba68ff9-9cc8-194d-8aaf-8cf60770eb8c    { channel_id: '181866881', channel_name: 'sae_jin' }
2019-07-28T17:58:58.388Z        dba68ff9-9cc8-194d-8aaf-8cf60770eb8c    instance
2019-07-28T17:58:58.393Z        dba68ff9-9cc8-194d-8aaf-8cf60770eb8c    28 Jul 17:58:58 - SEND: #sae_jin lol
2019-07-28T17:58:58.394Z        dba68ff9-9cc8-194d-8aaf-8cf60770eb8c    mark  sae_jin
END RequestId: dba68ff9-9cc8-194d-8aaf-8cf60770eb8c
REPORT RequestId: dba68ff9-9cc8-194d-8aaf-8cf60770eb8c  Duration: 3632.46 ms    Billed Duration: 3700 ms        Memory Size: 1024 MB     Max Memory Used: 58 MB
2019-07-28 10:58:58 127.0.0.1 - - [28/Jul/2019 10:58:58] "POST /scrape HTTP/1.1" 200 -

我想知道是不是因为 AWS serverless app 做不到。如果是这个原因,还有其他选择吗?我需要改用 EC2 吗?

您不应将无服务器用于需要连续 运行 的任务。它不是为那种用例设计的,并且有多种实际原因可以解释为什么它不是一个好主意:

  • 单个 Lambda 调用的运行时间上限为 15 分钟
  • 单个 Lambda 容器的生命周期(因为它们在调用中重复使用)在 6-10 小时范围内
  • Lambda 有一个基于调用量和运行时量的定价模型。调用成本极小,但与替代方案相比,运行时成本非常高。使用 "continuously re-invoked" Lambda 函数非常不划算

您的代码只运行一小会儿的实际原因是当函数returns响应时,代码执行被暂停。您不能有 运行 "background" Lambda 函数。

EC2 实例是基准解决方案,但更现代的解决方案是利用容器而不需要配置您自己的服务器 AWS Fargate