3

我们将 App Engine Standard 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 的地步,那里的服务运行良好,没有任何上述问题。

我的结论是,Serverless VPC 没有处理 redis 客户端一直努力保持与 redis 的连接打开的事实。我尝试了几种超时设置,但没有任何帮助。有没有人成功部署 App Engine Standard、Memorystore 和 Serverless 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
)

(我尝试了各种超时设置,但找不到任何帮助)

4

2 回答 2

0

我创建了一个 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)在进行一些修改后从 Google Cloud Platform Python 文档示例 repo 到 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。我将“<code>redis==3.3.8”更改为“<code>redis>=3.3.0”</p>

注意事项:

  • 确保使用“gcloud beta app deploy”而不是“gcloud app deploy”,因为它是无服务器 VPC 访问连接器工作所必需的。
  • 确保您为 memorystore 实例设置的授权网络与您为无服务器 VPC 访问连接器选择的网络相同

这对我来说按预期工作,你能检查一下这是否适合你吗?

于 2019-10-11T14:26:44.453 回答
0

您可以尝试使用最小空闲实例选项,这样您将至少有一个空闲实例等待为您的流量提供服务。请记住,这可能会改变您的计费成本。您还可以在这里找到计费计算器。如果最小空闲实例设置为 0,则在请求开始时没有可用的实例为您的流量提供服务,这可能是出现异常的原因。

于 2019-10-22T11:08:53.383 回答