Стандарт App Engine, бессерверные VPC, Cloud Memorystore, обеспечивающий значительное время ожидания

Мы настроили нашу службу App Engine Standard python 3 для подключения к Cloud Memorystore через бессерверную службу VPC (согласно документации и другим потокам переполнения стека). (Я включил конфигурацию app.yaml ниже). Все это работало хорошо, если только экземпляр ненадолго не простаивал. Со временем мы увидели большой объем:

  • Длительные необъяснимые зависания при звонках в Memorystore, хотя в конечном итоге они сработали
  • redis.exceptions.ConnectionError: Error 110 connecting to 10.0.0.12:6379. Connection timed out.
  • redis.exceptions.TimeoutError: Timeout reading from socket

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

Я пришел к выводу, что бессерверный VPC не справляется с тем фактом, что клиент redis постоянно пытается оставить соединение открытым для redis. Я пробовал несколько вариантов настроек тайм-аута, но ничего не помогло. Кто-нибудь успешно развернул App Engine Standard, Memorystore и бессерверный VPC?

env_variables:
  REDISHOST: <IP>
  REDISPORT: 6379

network:
  name: "projects/<PROJECT-ID>/global/networks/default"

vpc_access_connector:
  name: "projects/<PROJECT-ID>/locations/us-central1/connectors/<VPC-NAME>

Код, используемый для подключения к Memorystore (с использованием redis-py):

REDIS_CLIENT = redis.StrictRedis(
    host=REDIS_HOST, 
    port=REDIS_PORT, 
    retry_on_timeout=True, 
    health_check_interval=30
)

(Я пробовал различные настройки тайм-аута, но не нашел ничего, что помогло бы)


person jcjones1515    schedule 07.10.2019    source источник
comment
Не могли бы вы поделиться кодом, который вы используете для подключения к Memorystore? Какую клиентскую библиотеку вы используете?   -  person Nahuel Varela    schedule 10.10.2019
comment
@NahuelVarela добавил код, который создает экземпляр клиента, спасибо   -  person jcjones1515    schedule 10.10.2019
comment
Вы пробовали поиграть с запросами на разминку?   -  person TasosV    schedule 03.11.2019


Ответы (2)


Я создал экземпляр Memorystore и коннектор бессерверного доступа к VPC, как указано в документации (https://cloud.google.com/vpc/docs/configure-serverless-vpc-access), затем развернул этот образец (https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/appengine/standard_python37/redis ) из репозитория примеров документации Python для Google Cloud Platform в стандартную версию App Engine после внесения некоторых изменений:

Это мой app.yaml:

runtime: python37

# Update with Redis instance details
env_variables:
  REDIS_HOST: <memorystore-ip-here>
  REDIS_PORT: 6379

# Update with Serverless VPC Access connector details
vpc_access_connector:
  name: 'projects/<project-id>/locations/<region>/connectors/<connector-name>'
# [END memorystore_app_yaml_standard]

Я отредактировал код на main.py и использовал фрагмент, который вы используете для подключения к экземпляру memorystore. В итоге получилось так:

redis_client = redis.StrictRedis(
    host=redis_host, port=redis_port,
    password=redis_password,
    retry_on_timeout=True, 
    health_check_interval=30
)

Отредактировал файл requirements.txt. Я заменил «redis==3.3.8» на «redis>=3.3.0»

На заметку:

  • Обязательно используйте «развертывание бета-приложения gcloud» вместо «развертывание приложения gcloud», поскольку это необходимо для работы коннектора бессерверного доступа VPC.
  • Убедитесь, что авторизованная сеть, которую вы задали для экземпляра хранилища памяти, такая же, как и для коннектора бессерверного доступа к VPC.

У меня это работает, как и ожидалось, не могли бы вы проверить, работает ли это для вас?

person Jose V    schedule 11.10.2019
comment
Привет, Джоуи, это в основном те шаги, которым мы следовали. Он работает изначально и отлично подключается к Redis. Однако, как только экземпляры на какое-то время бездействуют (но не отключены), им сложно подключиться к Redis. Если у вас установлен min idle на 0, вы можете не увидеть этого в тестовом приложении. Обычно, если вы нажмете приложение, подождите 5 минут или около того, убедитесь, что приложение все еще работает, а затем нажмите его еще раз, и вы начнете видеть таймауты. Мы убедились в этом на тысячах этих исключений за несколько дней. - person jcjones1515; 11.10.2019

Вы можете попробовать использовать параметр min idle instance, так что у вас будет хотя бы один неактивный экземпляр, который будет ждать обслуживания вашего трафика. Помните, что это может изменить вашу стоимость счета. Также здесь вы можете найти платежный калькулятор. Если для минимального количества простаивающих экземпляров установлено значение 0, нет доступных экземпляров для обслуживания вашего трафика при запуске запросов, и это может быть причиной возникновения исключений.

person chainicko    schedule 22.10.2019
comment
Привет @chainicko, я не думаю, что холодный запуск - моя проблема, проблема в экземплярах, которые существуют некоторое время, но простаивают - person jcjones1515; 01.11.2019