我正在为外部API创建一个监视系统,如果响应与初始请求不同,我需要在该系统上调用一个函数。
目前在我的函数周围没有进行长时间的轮询,我得到了以下信息:
let gameAPI = new game(
[
"email@email.com",
"password",
"secret",
"secret"
]
);
let lastModified;
gameAPI.login().then(() => {
gameAPI.getProfileStats(process.argv[2], process.argv[3], process.argv[4]).then(stats => {
//first run grab this only
if(lastModified < stats.data.lastModified) {
//we found new data, stop polling & update mySQL database.
} else {
//continue to run every 1 minute...
}
});
});
AWS Lambda 是该理论的一个好的解决方案吗?如果是这样,自Lambda收取计算机电源使用费后,我该怎么做?
答案 0 :(得分:1)
绝对不是一个好主意,在这种情况下,您不会让Lambda函数退出,并且会不断向您收费。最重要的是,Lambda的执行时间最多为15分钟,因此您需要经常触发它。
一种可行的方法仍然是使用Lambda,而不是继续运行,而是在else语句上退出,并使用CloudWatch触发器每分钟调用一次函数,这样就可以每分钟运行一次检查,但仅在您执行检查功能期间收取费用。
如果要监视的用户很多,则取决于实际数量,一个简单解决方案将是一个EC2,并且具有很长的生存期,并将Last Checked时间戳存储在DB中。对于每个时间段(例如1分钟),请选择上一次更新> 1分钟前的项目的数据库,并将其存储在该本地进程的队列中。然后在此过程中,以一定的速率(例如1 /秒),进行获取和检查逻辑,并更新数据和数据库中的“最后检查”。
如果您希望获得大批量交易,可以使用SQS + Lambda w / CloudWatch + ELB,并带有上次检查的时间戳:
这样,您几乎可以拥有无限的评价。或者,如果您希望降低复杂度,可以使用简单的EC2实例并手动管理实例并进行扩展。
答案 1 :(得分:0)
让“ GAME API”将统计信息推送到SQS队列会很好。
然后,使用者将长时间轮询队列并将结果保存到所需的任何位置。这有几个好处。
在使用者代码中将数据保存到关系数据库(如MySQL)中时,可能会导致意外问题,例如,当您有多个使用者轮询同一队列时,表锁定。因此,将NoSQL DB用于此类解决方案是一个好主意,因为它们在可伸缩性方面很灵活。
例如,Dynamo DB可以为表指定WCU(写入容量单位),因此可以节省成本并可以控制所提供的内容。
最后,SQS可以与Lambda函数集成在一起(作为异步Lambda调用),作为使用者,这可以确保仅在需要时才运行该函数,因为SQS在有记录要保存时会触发该函数。
因此,您的问题的答案是肯定的。使用Lambda是一个好主意,但是您应该将其与SQS队列一起使用。
我希望这会有所帮助。