我们在Google App引擎标准环境中,使用F2实例(第1代-python 2.7)。我们有一个遵循此流程的报告模块。
工人任务在队列中启动。
task = taskqueue.add(
url='/backendreport',
target='worker',
queue_name = 'generate-reports',
params={
"task_data" : task_data
})
在worker类中,我们查询Google数据存储区并将数据写入Google表格。我们对记录进行分页以查找其他报告元素。当我们找到其他页面时,我们再次调用同一任务以生成另一个写操作,因此它可以获取下一组报告元素并将它们写到Google工作表中。
在backendreport.py中,我们有以下代码。
class BackendReport():
# Query google datastore to find the records(paginated)
result = self.service.spreadsheets().values().update(
spreadsheetId=spreadsheet_Id,
range=range_name,
valueInputOption=value_input_option,
body=resource_body).execute()
# If pagination finds additional records
task = taskqueue.add(
url='/backendreport',
target='worker',
queue_name = 'generate-reports',
params={
"task_data" : task_data
})
我们运行与前端作业(而不是任务)相同的BackendReport(带有分页)。分页工作没有任何错误-这意味着我们获取记录的每一页并显示在前端。但是,当我们迭代执行任务时,它会因软内存限制问题而失败。我们的印象是,每次(对于每个分页)调用一项任务时,它都应独立执行,并且不应有任何内存限制。我们在这里做错了什么?
为什么达到软内存限制时,GCP不会旋转另一个实例-自动(我们的实例类为F2)。错误消息说,服务总共3个请求后达到512 MB的软内存限制-这是否意味着backendreport模块启动了3个请求-是否意味着有3个任务调用(/ backendreport)?
达到软内存限制后,为什么GCP不旋转其他实例
[当应用程序引擎决定启动新实例时的主要机制之一是max_concurrent_requests
。您可以检出可以在此处配置的所有automatic_scaling
参数:
https://cloud.google.com/appengine/docs/standard/python/config/appref#scaling_elements
这是否意味着backendreport模块启动了3个请求-是否意味着有3个任务调用(/ backendreport)?
我想是的。可以肯定的是,您可以打开日志查看器,找到打印该日志的日志,并通过该instance-id过滤日志,以查看它处理到该点的所有请求。
您正在Cloud Tasks中创建多个任务,但是在那里的分派队列没有限制,并且当队列尝试同时分派多个任务时,它达到了内存限制。因此,您要设置的限制实际上是max_concurrent_requests
,但不是针对app.yaml
中的实例,应该为queue.yaml
中的队列调度设置限制,因此一次仅调度一个任务:
- name: generate-reports
rate: 1/s
max_concurrent_requests: 1