我们将App Engine标准python 3服务配置为通过无服务器VPC服务(根据文档和其他堆栈溢出线程)连接到Cloud Memorystore。 (我在下面包含了app.yaml配置)。除非实例闲置了一小会儿,否则一切都很好。随着时间的流逝,我们看到了大量:
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
)
(我尝试了各种超时设置,但找不到任何有帮助的东西)
答案 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
”更改为
注意事项:
这对我来说很有效,请您检查一下是否对您有用?
答案 1 :(得分:0)
您可以尝试使用min idle instance选项,因此您将至少有一个空闲实例等待服务。请记住,这可能会更改您的billing cost。同样在这里您可以找到billing calculator。 如果最小空闲实例设置为0,则在请求开始时将没有可用的实例来为您的流量服务,这可能是出现异常的原因。