2015-06-18 1 views
4

У меня есть проекты, развернутые в Google App Engine с API Google (Python). Каждый запрос к любому из API создает соединение с базой данных, выполняет процедуру и возвращает данные и закрывает соединение. Я не смог получить доступ к любому из API, поскольку он показывалкак решить «Процесс завершен, потому что срок подачи заявки был превышен. (Код ошибки 123)» в google api?

«Процесс завершен, потому что срок выполнения запроса был превышен. (Код ошибки 123)» и «Этот запрос запустил новый процесс для вашего приложения и, таким образом, что ваш код приложения будет загружен в первый раз. Таким образом, этот запрос может занять больше времени и использовать больше CPU, чем типичный запрос для вашего приложения ». ошибка.

База данных также находится в облаке (Google Cloud SQL). Когда я проверил, было 900 соединений, и было выполнено более 150 экземпляров, но запрос api не обрабатывался. Это происходит часто. Поэтому я снова перезапускаю сервер базы данных и снова развертываю код API для решения этой проблемы. В чем проблема и как я могу решить эту проблему навсегда? Вот мой питон код для подключения к базе данных: -

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 
+0

* Как я могу решить это в будущем? * Разве вы его не решили? –

+1

это решение на время. Но я не думаю, что это связано с изменениями в app.yaml для незанятых экземпляров. И в чем причина этого? –

+0

у вас увеличено количество неиспользуемых экземпляров -> больше шансов, что у вас есть незанятый экземпляр для запроса -> уменьшено количество раз, когда необходимо запустить новые экземпляры –

ответ

3

Два возможных улучшений:

  • код запуска для случаев может занять слишком много времени, проверить, что время запуска и, если это возможно использование warmup requests уменьшить время запуска. Поскольку увеличение количества ваших незанятых экземпляров, похоже, помогает, время запуска может занять слишком много времени.
  • Лучшим подходом было бы вызов внешних служб (например, разговор с Календарем Google) в Task Queue вне области пользовательского запроса. Это дает вам 10-минутный срок, а не 60-летний крайний срок для запросов пользователей.
+0

Но все отлично работало. Случилось. Тогда как это возможно? –

+0

Включите мониторинг облаков в своем проекте и проверьте, что происходит так долго, вы получаете отличную разбивку всех вызовов и их таймингов. Метрики не нужно угадывать .... – koma

+0

запросы на разогрев не работают, и TaskQueus не подходят в моих ситуациях –