如何解决google api中的“由于超出请求期限而终止进程。(错误代码123)”?

Posted

技术标签:

【中文标题】如何解决google api中的“由于超出请求期限而终止进程。(错误代码123)”?【英文标题】:how to solve "Process terminated because the request deadline was exceeded. (Error code 123)" in google api? 【发布时间】:2015-09-03 23:13:28 【问题描述】:

我在具有 Google API (Python) 的 Google App Engine 上部署了一个项目。对任何 API 的每个请求都会建立数据库连接,执行过程并返回数据并关闭连接。我无法访问任何显示的 API

“进程终止,因为超过了请求期限。(错误代码123)”和“此请求导致为您的应用程序启动一个新进程,从而导致您的应用程序代码首次加载。此请求因此,与应用程序的典型请求相比,可能需要更长的时间并使用更多的 CPU。”错误。

数据库也在云端 (Google Cloud SQL)。当我检查时,有 900 个连接,超过 150 个实例启动,但没有处理任何 api 请求。这种情况经常发生。所以我重新启动数据库服务器并再次部署 API 代码来解决这个问题。有什么问题,我怎样才能永久解决这个问题?这是我用于数据库连接的 python 代码:-

import logging
import traceback
import os
import mysqldb
from warnings import filterwarnings

filterwarnings('ignore', category = MySQLdb.Warning)

class TalkWithDB:
    def callQueries(self,query,req_args):
        try:
            if (os.getenv('SERVER_SOFTWARE') and os.getenv('SERVER_SOFTWARE').startswith('Google App Engine/')):
                db = MySQLdb.connect(unix_socket = UNIX_SOCKET + INSTANCE_NAME, host = HOST, db = DB, user = USER ,charset='utf8',use_unicode=True)
            else:
                db = MySQLdb.connect(host = HOST, port = PORT, db = DB, user = USER, passwd = PASSWORD,charset='utf8',use_unicode=True)

            cursor = db.cursor()
            cursor.connection.autocommit(True)
        try:
        sql = query+str(req_args)
        logging.info("QUERY = "+ sql )
        cursor.execute(sql)     
        procedureResult = cursor.fetchall();
        if str(procedureResult) == '()':
            logging.info("Procedure Returned 0 Record")
            procedureResult = []
            procedureResult.append(0:"NoRecord", 1:"Error")
            #procedureResult = (("NoRecord","Error",),)
        elif procedureResult[0][0] == 'Session Expired'.encode(encoding='unicode-escape',errors='strict'):
            procedureResult = []
            procedureResult.append(0:"SessionExpired", 1:"Error")                     
            except Exception, err:
        logging.info("ConnectDB.py : - Error in Procedure Calling :  " + traceback.format_exc())
        #procedureResult = (('ProcedureCallError','Error',),)
        procedureResult = []

        procedureResult.append(0:"ProcedureCallError", 1:"Error")         

        except Exception, err:
            logging.info("Error In DataBase Connection : " + traceback.format_exc())
           #procedureResult = (('DataBaseConnectionError','Error',),)
        procedureResult = []

        procedureResult.append(0:"DataBaseConnectionError", 1:"Error")       
# disconnect from server
        finally:
            try:
                cursor.close()
                db.close()
            except Exception, err:
                logging.info("Error In Closing Connection : " + traceback.format_exc())
            return procedureResult

【问题讨论】:

以后怎么解决?你不是已经解决了吗? 暂时解决了这个问题。但我不认为这是由于空闲实例的 app.yaml 发生了变化。这是什么原因? 您增加了空闲实例的数量 -> 有更多机会拥有用于请求的空闲实例 -> 减少了需要启动新实例的次数 所以这意味着在这种情况下实例没有起来?那么部署如何解决目的呢? 我再次部署了应用程序,更改了 app.yaml 。成功部署后一切正常。但是如果一个项目的空闲实例发生了变化,那么其他 API 项目是如何开始工作的呢? 【参考方案1】:

两个可能的改进:

您的实例启动代码可能需要很长时间,请检查启动时间,如果可能,请使用warmup requests 以减少启动时间。由于增加空闲实例似乎有帮助,因此您的启动时间可能会过长。 更好的方法是在用户请求范围之外的 Task Queue 中调用外部服务(例如与 Google 日历交谈)。这为您提供了 10 分钟的截止日期,而不是用户请求的 60 秒截止日期

【讨论】:

但一切正常。实例增加了。那这怎么可能呢? 在您的项目上启用云监控并验证花费了这么长时间,您可以很好地了解所有呼叫及其时间安排。指标避免了猜测...... 预热请求不起作用,TaskQueus 不是最适合我的情况

以上是关于如何解决google api中的“由于超出请求期限而终止进程。(错误代码123)”?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 中的 API 重命名 Google Sheets 电子表格中的(工作)表?

如何长时间访问(离线)Google API?

如何解决导入com.google.android.gms.common.api.ResultCallback;

无法在 google api youtube 中授权,如何解决? [关闭]

请求 google Ads Api 时如何解决 DEVELOPER_TOKEN_PROHIBITED 错误?

如何使用 oauth2 并通过 google api 刷新令牌?