Оптимизация подключения к GCP mysql из облачной службы?

У меня есть приложение весенней загрузки, работающее в облаке, пока мне нужно было только добавить весеннее облако 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, это докер или мое приложение? куда должен идти файл ConnectionPoolContextListener.java? В комментарии к самому файлу также говорится не использовать это для пользователей Java, а вместо этого использовать

Cloud SQL JDBC Socket Factory Но когда я перехожу по этой ссылке, мне предлагается добавить зависимость для 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 с включенным API администратора.

  2. Я включил подключение к облачному SQL в моем облаке, выбрав свой экземпляр базы данных.

  3. Меня очень смущает документация о том, какой следующий шаг и что делать дальше.


person Oirampok    schedule 31.05.2021    source источник


Ответы (1)


Cloud Run предоставляет сокет домена Unix при настройке экземпляра Cloud SQL — это файл, который можно использовать для подключения к базе данных. Вы используете Java-коннектор Cloud SQL, который позволяет обойти использование сокета Unix (который обычно предпочтительнее для Java, поскольку сокеты Unix изначально не поддерживаются).

Вместо того, чтобы улучшить время холодного запуска, я рекомендую сделать две вещи:

  1. Уменьшите количество подключений в вашем пуле. Хотя оптимальное число сильно различается в зависимости от приложения, 20 почти наверняка больше, чем вам нужно. Как правило, попробуйте 2 * количество ядер, используемых в качестве начального значения. , и увеличивайте/уменьшайте по мере необходимости. Хикари использует для этого maximumPoolSize.

  2. Отрегулируйте количество начальных подключений в вашем пуле. Hikari предлагает minimumIdle, который устанавливает минимальное количество незанятых подключений в пуле, и до maximumPoolSize. Хотя Hikari рекомендует не устанавливать это значение (чтобы у вас был фиксированный пул), установка его на 0 означает, что ваш пул не будет устанавливать соединения при запуске. Это означает, что ваше приложение будет запускаться быстрее, но в среднем потребуется больше времени для получения соединения из пула.

person kurtisvg    schedule 01.06.2021
comment
Хорошо, я обязательно уменьшу размер пула, так как у меня только одно ядро. Но мой вопрос остается в силе: как лучше всего подключить приложение speingboot, работающее в облаке, к экземпляру GCP mysql? Является ли использование зависимости spring-cloud-gcp-starter-sql-mysql оптимальным способом или есть более быстрые методы? - person Oirampok; 01.06.2021
comment
использование облачного прокси-сервера sql локально сократило время запуска на целых 7 секунд, поэтому я думаю, что это может быть оптимальным по сравнению с использованием зависимости? - person Oirampok; 01.06.2021
comment
Не должно быть существенной разницы между прокси-сервером и коннектором Java с точки зрения производительности. Поскольку вы запускаете прокси заранее, вы предварительно загружаете часть работы, которую выполняет коннектор Java как часть запуска. Если вы установите minimumIdle на 0, Hikari не будет блокировать инициализацию при создании этих подключений (но первый запрос, который подключается, будет медленнее, так как он будет блокировать эту работу). - person kurtisvg; 01.06.2021
comment
Это имеет смысл, я думаю, что тогда я буду придерживаться зависимости. Благодарю вас! - person Oirampok; 01.06.2021