Стандарт 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 изо всех сил пытается оставить соединение для повторного открытия все время. Я пробовал несколько вариантов настроек тайм-аута, но ничего не помогло. Кто-нибудь успешно развернул 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
)

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

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 в стандартную версию 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.

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

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

Другие вопросы по тегам