Стандарт App Engine, бессерверные VPC, облачное хранилище памяти, обеспечивающее значительное время ожидания - PullRequest
1 голос
/ 07 октября 2019

Мы настроили нашу стандартную службу Python 3 App Engine Standard для подключения к Cloud Memorystore через службу Serverless 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, где сервис работает отлично без каких-либо из перечисленных проблем.

Мой вывод заключается в том, что Serverless 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
)

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

Ответы [ 2 ]

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

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

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

Я создал экземпляр 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
)

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

. Замечания:

  • Убедитесь, что вы используете «gcloud beta app deploy» вместо «gcloud app deploy», поскольку это необходимо для работы коннектора Serverless VPC Access.
  • Убедитесь, что в авторизованной сети вы указалиЭкземпляр memorystore тот же, что вы выбрали для безсерверного соединителя доступа VPC

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

...