情况:
我的项目主要是自动化任务。 我的GAE(标准环境)应用具有40克朗的工作,它们全部在默认模块(前端)上运行:
- description: My cron job Nth
url: /mycronjob_n/ ###### Please note n is the nth cron job.
schedule: every 1 minutes
每个cron作业
@app.route('/mycronjob_n/')
def mycronjob_n():
for i in (0,100):
pram = prams[i]
options = TaskRetryOptions(task_retry_limit=0,task_age_limit=0)
deferred.defer(mytask,pram)
mytask
在哪里
def mytask(pram):
#Do some loops, read and write datastore, call api, which I guesss taking less than 30 seconds.
return 'Task finish'
问题:
作为问题的标题,我用光了内存。前端实例的小时数增加到100小时。
我的错误想法?
defer任务在后台运行,因为它不是用户访问网站时发送请求的东西。因此,它们不会被视为请求。
我将cronjobs_n分解为不同的小任务,因为我认为这可以减少每个cronjobs_n的运行时间,从而减少实例的内存消耗。
我的问题:(目的:将前端/后端实例的时间保持在尽可能低的水平,并且我接受延迟)
如果3-4个实例不能处理4000个请求,为什么GAE不增加10到20个F1实例,然后在闲置时关闭呢?我在app.yaml中设置了自动缩放。我没有看到广告宣传的GAE自动缩放的含义。
优化我的应用程序的最佳方法是什么? 如果将延迟任务计为请求,那么将mycronjob_n拆分为不同的小任务是没有意义的,对吗?我的意思是,我当前的方法与:
@ app.route('/ mycronjob_n /') def mycronjob_n():
for i in (0,100):
pram = prams[i]
options = TaskRetryOptions(task_retry_limit=0,task_age_limit=0)
mytask(pram) #Call function mytask
在这里,我的应用每分钟有40个请求,每个请求运行100 x 30s = 3000s吗?那么,这种方法也将返回内存不足吗? 我应该创建在F1实例上运行的后端服务,然后将所有cron作业放到该后端服务上吗?我听说一个请求可以运行24小时。
如果我将默认服务实例从F1更改为F2,F3,我还能享受28小时的免费服务吗?我听说免费套餐仅适用于F1。如果后端服务在B2而不是B1上运行,我的后端服务会免费提供9个小时吗?
我的遗憾 -很遗憾我为该项目选择了GAE。我选择它是因为它具有免费套餐。但是我意识到免费套餐只是出于爱好/测试目的。如果我运行一个真实的应用程序,则成本将迅速增加,这使我认为GAE昂贵。即使我尽力优化它们,数据存储区的读取/写入也是如此昂贵。前端时间也总是很高。我每月为GAE支付40 USD。每月40美元,如果我选择Heroku,Digital Ocean,也许我可以获得更好的服务器?你这样认为吗?
答案 0 :(得分:2)
是的,任务队列请求(包括延迟的)也是请求,它们可以比用户请求运行更长的时间。他们需要实例来为其服务,这算作实例时间。由于您每分钟至少有一个cron作业运行-您将没有15分钟的空闲时间间隔来关闭实例-因此,您至少需要一直 个实例运行。如果您使用F1 / B1以外的任何实例类-您将超出免费实例小时配额。请参阅Standard environment instances帐单。
您似乎给人一种印象,即请求数量是导致成本上升的原因。不是,至少不是直接。罪魁祸首很可能是正在运行的实例数。
如果3-4个实例不能处理4000个请求,为什么GAE不添加10个 最多增加20个F1实例,然后在闲置时关闭?
GAE最有可能做到这一点-产生多个实例。但是您每分钟都会不断地发送请求,它们不会足够长时间地进入空闲状态,因此它们不会关闭。哪个实例使您的工作时间延长了?
您可以执行以下两项操作:
错开您延迟执行的任务,以使它们不会被击中,需要同时处理。在这种情况下,可能需要更少的实例(甚至可能只有一个实例?)。参见Combine cron jobs to reduce number of instances和Preventing Google App Engine Cron jobs from creating multiple instances (and thus burning through all my instance hours)
调整应用程序的缩放配置(但是范围是有限的)。参见Scaling elements。
您还应该仔细阅读How Instances are Managed。
重要:按实例小时数计费时,您在计费订单项中将看不到任何实例类。相反,您将 查看实例时间的适当倍数。例如,如果您 使用F4实例一小时,您不会看到列出的“ F4”,但是 请按F1费率查看四个实例小时的计费。
关于RAM的使用,将cron作业拆分为多个任务不一定有帮助,请参见App Engine Deferred: Tracking Down Memory Leaks
最后,将GAE与Heroku进行比较的成本,Digital Ocean并不是苹果对苹果的比较:GAE是PaaS,而不是IaaS,恕我直言,IMHO的价格会更高。选择一个或另一个完全取决于您。