代码之家  ›  专栏  ›  技术社区  ›  jcjones1515

应用程序引擎标准、无服务器VPC、云内存存储提供大量超时

  •  0
  • jcjones1515  · 技术社区  · 6 年前

    我们将我们的应用引擎标准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

    这些都发生在我不得不回到AppEngine Flexible的时候,那里的服务运行良好,没有任何上述问题。

    我的结论是,无服务器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
    )
    

    (我尝试了各种超时设置,但没有找到任何有用的设置)

    0 回复  |  直到 6 年前
        1
  •  0
  •   Jose V    6 年前

    我创建了一个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 doc样本回购到应用引擎标准:

    这是我的应用。亚马尔:

    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
    )
    

    我编辑了要求。txt。我变了 redis==3.3.8 为了 redis>=3.3.0 ”

    注意事项:

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

    这对我来说就像预期的一样,你能检查一下这对你是否有效吗?

        2
  •  0
  •   Nicholas    6 年前

    你可以尝试使用 min idle instance 选项,因此您将至少有一个空闲实例等待为您的流量提供服务。记住,这可能会改变你的想法 billing cost .你也可以在这里找到 billing calculator . 如果min idle instances设置为0,则在请求启动时没有可用的实例为您的流量提供服务,这可能是出现异常的原因。

    推荐文章