【问题标题】:优化从云运行服务到 GCP mysql 的连接?
【发布时间】:2021-08-19 04:40:13
【问题描述】:

我有一个在 cloud run 上运行的 spring boot 应用程序,到目前为止我只需要添加 spring cloud gcp mysql

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-gcp-starter-sql-mysql</artifactId>
        <version>1.2.8.RELEASE</version>
    </dependency>

在我的 POM 中的依赖关系,并配置我的 application.yml 文件来设置数据库名称、连接名称等,它在本地和云上运行良好。

我的应用程序.yml:

spring:
    cloud:
        gcp:
            sql:
                enabled: true
                database-name: pos_database
                instance-connection-name: pos-sys:asia-southeast2:pos-server-database
    datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: ***
        password: ***
        hikari:
            maximum-pool-size: 20

但是我意识到冷启动性能受到了影响,因为在启动时套接字工厂通过 SSL 套接字连接到数据库实例:

2021-05-31 13:10:07.152  INFO 1539 --- [onnection adder] c.g.cloud.sql.core.CoreSocketFactory     : 
Connecting to Cloud SQL instance [pos-sys:asia-southeast2:owl-server-database] via SSL socket.

我得到一堆重复的行

2021-05-31 13:10:09.461  INFO 1539 --- [connection adder] c.g.cloud.sql.core.CoreSocketFactory     : 
Connecting to Cloud SQL instance [pos-sys:asia-southeast2:pos-server-database] via SSL socket.

我知道有一种更快的连接方式,然后应用程序在云上运行,到目前为止我一直在关注本教程:

https://cloud.google.com/sql/docs/mysql/connect-run

但我对最后一部分感到非常困惑,它说我必须与 unix 套接字连接,这是 docker 的事情还是在我的应用程序中? ConnectionPoolContextListener.java 在哪里 文件必须去吗? 它还在文件本身的注释中说不要将其用于 java 用户,而是使用

Cloud SQL JDBC 套接字工厂 但是当我转到那个链接时,它说要为 mysql-connector 添加一个依赖项,但这不是已经包含在 spring-gcp-starter-mysql 中了吗?它还说以这种格式创建一个连接字符串:

jdbc:mysql:///<DATABASE_NAME>?cloudSqlInstance=<INSTANCE_CONNECTION_NAME>&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=<MYSQL_USER_NAME>&password=<MYSQL_USER_PASSWORD> 

但没有提到我把这个放在哪里?

总结一下:

  1. 我有一个云 mysql 实例,启用了 admin api。

  2. 我通过选择我的数据库实例在我的云运行中启用了连接到 Cloud SQL。

  3. 我对下一步是什么以及下一步做什么的文档感到非常困惑。

【问题讨论】:

    标签: java spring-boot google-cloud-platform google-cloud-sql spring-cloud-gcp


    【解决方案1】:
    推荐的答案 Google Cloud

    Cloud Run 在配置 Cloud SQL 实例时提供一个 Unix 域套接字 - 它是一个可用于连接到数据库的文件。您正在使用 Cloud SQL Java 连接器,它允许您绕过使用 Unix 套接字(这在 Java 上通常是首选,因为原生不支持 Unix 套接字)。

    为了改善冷启动时间,我建议做两件事:

    1. 减少池中的连接数。虽然应用程序之间的最佳数量差异很大,但几乎可以肯定 20 比您需要的要多得多。根据经验,try 2 * the number of cores used as your starting value, and increase/decrease as needed。 Hikari 使用maximumPoolSize 来执行此操作。

    2. 调整池中的起始连接数。 Hikari 提供minimumIdle,它设置池中的最小空闲连接数,最多为maximumPoolSize。虽然 Hikari 建议不要设置此值(因此您有一个固定的池),但将其设置为 0 意味着您的池不会在启动时建立连接。这意味着您的应用程序启动速度会更快,但平均需要更长的时间才能从池中获得连接。

    【讨论】:

    • 好的,我肯定会减小池大小,因为我只运行一个核心。但是我的问题仍然存在,将在云上运行的 speingboot 应用程序连接到 GCP mysql 实例的最佳方法是什么?使用“spring-cloud-gcp-starter-sql-mysql”依赖是最佳方式还是有更快的方法?
    • 在本地使用云 sql 代理将我的启动时间缩短了 7 秒,所以我认为与使用依赖项相比可能是最佳的?
    • 代理和 java 连接器在性能方面应该没有显着差异。因为您提前启动了代理,所以您预先获取了 java 连接器在启动过程中所做的一些工作。如果您将minimumIdle 设置为 0,Hikari 不会在创建这些连接时阻止初始化(但连接的第一个请求会更慢,因为它会阻止该工作)。
    • 这是有道理的,我想我会坚持依赖。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2020-08-18
    • 2011-04-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多