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
我正在开发一个项目,使用 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