Первый запрос к хранилищу данных всегда медленный - PullRequest
0 голосов
/ 04 октября 2019

У меня есть проект Python 3.7, который общается с Datastore с помощью библиотеки google.cloud.ndb.

Я заметил, что первый запрос при запуске экземпляра всегда на порядок (несколькосекунд) медленнее, чем последующие. Это верно даже при локальном запуске с эмулированным хранилищем данных. Я проверил, что задержка вызвана первым ndb.Key(...).get(), который запускается. Предположительно подключение к хранилищу данных занимает некоторое время для настройки?

Кто-нибудь нашел способ уменьшить эту задержку?

Пример кода:

from flask import Flask
from google.cloud import ndb

import time

client = ndb.Client()

def ndb_wsgi_middleware(wsgi_app):
    def middleware(environ, start_response):
      with client.context():
        return wsgi_app(environ, start_response)
    return middleware

app = Flask(__name__)
app.wsgi_app = ndb_wsgi_middleware(app.wsgi_app)

@app.route('/main')
def main():
  now_ts = time.time()
  org = ndb.Key(Org, 1).get()
  print('Finished get in %f' % (time.time() - now_ts))
  return 'Does not exist' if org is None else 'Exists'

class Org(ndb.Model):
  pass

if __name__ == '__main__':
  app.run(host='0.0.0.0', port=8080, debug=True)

Вывод после 2 localhost:8080/mainизвлекает из браузера (используя эмулятор локального хранилища данных, вызванный командой gcloud beta emulators datastore start):

Finished get in 2.043116
127.0.0.1 - - [09/Oct/2019 22:41:49] "GET /main HTTP/1.1" 200 -
Finished get in 0.001995
127.0.0.1 - - [09/Oct/2019 22:41:56] "GET /main HTTP/1.1" 200 -

1 Ответ

0 голосов
/ 04 октября 2019

Причина, по которой вы испытываете это поведение, заключается в том, что, если не указано иное, все приложения App Engine закрывают свои экземпляры, когда они простаивают. Это означает, что если они получают новый запрос, им нужно время, чтобы развернуться и ответить, что приведет к более высокому времени отклика, чем в противном случае. Это сделано для того, чтобы избежать ненужного использования ресурсов и генерирования сборов, так как экземпляры взимаются к моменту их запуска.

Этого можно избежать, используя запросы прогрева , что является специальнымтип запроса на загрузку, который подготавливает экземпляр перед выполнением активных запросов.

Другим вариантом будет настройка Автоматическое масштабирование в вашем приложении с использованием модулей и установка значения для минимальных простоев. Это означает, что если вы настроите его, то по крайней мере один экземпляр будет работать постоянно, что предотвращает необходимость любых запросов на загрузку. Однако, поскольку эти экземпляры находятся в постоянном рабочем состоянии, это повлечет за собой дополнительные расходы.

...