App Engine Standard,无服务器VPC,Cloud Memorystore导致大量超时

时间:2019-10-07 20:28:20

标签: google-app-engine redis google-cloud-memorystore google-vpc

我们将App Engine标准python 3服务配置为通过无服务器VPC服务(根据文档和其他堆栈溢出线程)连接到Cloud Memorystore。 (我在下面包含了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 个答案:

答案 0 :(得分:0)

我按照文档(https://cloud.google.com/vpc/docs/configure-serverless-vpc-access中的说明创建了一个Memorystore实例和一个无服务器VPC访问连接器,然后从Google Cloud Platform Python文档示例仓库中将该示例(https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/appengine/standard_python37/redis)部署到App Engine Standard进行一些修改后:

这是我的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 beta应用程序部署”而不是“ gcloud app deploy”,因为它是使无服务器VPC Access连接器正常工作所必需的。
  • 确保您设置为memorystore实例的授权网络与为无服务器VPC访问连接器选择的授权网络相同

这对我来说很有效,请您检查一下是否对您有用?

答案 1 :(得分:0)

您可以尝试使用min idle instance选项,因此您将至少有一个空闲实例等待服务。请记住,这可能会更改您的billing cost。同样在这里您可以找到billing calculator。 如果最小空闲实例设置为0,则在请求开始时将没有可用的实例来为您的流量服务,这可能是出现异常的原因。