2

我们在 Google App 引擎标准环境中,F2 实例(第 1 代 - python 2.7)。我们有一个遵循此流程的报告模块。

Worker Task 在队列中启动。

    task = taskqueue.add(
            url='/backendreport',
            target='worker',
            queue_name = 'generate-reports',
            params={
                "task_data"     : task_data
            }) 

在 worker 类中,我们查询 Google 数据存储并将数据写入 Google Sheet。我们对记录进行分页以查找其他报告元素。当我们找到额外的页面时,我们再次调用相同的任务以产生另一个写入,因此它可以获取下一组报告元素并将它们写入 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)?

4

2 回答 2

1

当达到软内存限制时,为什么 GCP 不旋转不同的实例

应用引擎决定启动新实例时的主要机制之一是max_concurrent_requests. 您可以在此处签出automatic_scaling您可以配置的所有参数:

https://cloud.google.com/appengine/docs/standard/python/config/appref#scaling_elements

这是否意味着 backendreport 模块发出了 3 个请求 - 这是否意味着有 3 个任务调用 (/backendreport)?

我认同。可以肯定的是,您可以打开日志查看器,找到打印此内容的日志并按该实例 ID 过滤您的日志,以查看它处理的所有导致该点的请求。

于 2020-03-10T21:58:08.433 回答
0

您在 Cloud Tasks 中创建了多个任务,但那里的调度队列没有限制,并且当队列尝试同时调度多个任务时,它会达到内存限制。因此,您要设置的限制确实是max_concurrent_requests,但不是针对 中的实例app.yaml,应该为 中的队列调度设置它queue.yaml,因此一次只调度一个任务:

- name: generate-reports
  rate: 1/s
  max_concurrent_requests: 1
于 2020-03-11T04:19:34.930 回答