Увеличенная задержка при использовании @Transactional (только для чтения = true)

#postgresql #spring-boot #jooq #hikaricp #pg-jdbc

#postgresql #пружинный ботинок #jooq #hikaricp #pg-jdbc

Вопрос:

Я работаю с серверной службой (Spring Boot 2.2.13.RELEASE Hikari JOOQ), которая использует кластер баз данных AWS Aurora PostgreSQL, сконфигурированный с узлом записи (первичным) и узлом чтения (реплики чтения). Узел считывателя только что находился в режиме ожидания / прогрева, ожидая повышения до основного в случае сбоя.

Недавно мы решили начать обслуживать запросы исключительно с узла Reader для некоторых наших конечных точек GET. Для достижения этой цели мы использовали «разновидность» RoutingDataSource, так что всякий раз, когда сервис аннотируется с помощью @Transactional(только для чтения = true), запросы выполняются к источнику данных reader.

До этого все шло гладко. Однако после применения этого решения я заметил увеличение задержки до 3 раз по сравнению с основным источником данных. Задержка увеличилась из-за DataDog

После детализации этого я обнаружил, что каждая транзакция выполняла пару дополнительных обходов в БД, чтобы УСТАНОВИТЬ ХАРАКТЕРИСТИКИ СЕАНСА:

УСТАНОВИТЬ ХАРАКТЕРИСТИКИ СЕАНСА ТОЛЬКО ДЛЯ ЧТЕНИЯ ФАКТИЧЕСКИЙ ЗАПРОС / ЗАПРОСЫ УСТАНОВИТЬ ХАРАКТЕРИСТИКИ СЕАНСА ЧТЕНИЕ ЗАПИСЬ

Задайте характеристики сеанса для каждой транзакции из Datadog

Чтобы улучшить это, я попытался поиграть с настройкой readOnlyMode, которая была введена в pg-jdbc pg-jdbc 42.2.10. Этот параметр позволяет управлять поведением, когда для соединения установлено значение только для чтения (только для чтения = true).

https://jdbc.postgresql.org/documentation/head/connect.html

В моей первой попытке я использовал только для чтения = true и readOnlyMode=всегда. Несмотря на то, что я опустился до просмотра инструкций SET SESSION CHARACTERISTICS , задержка осталась неизменной. Наконец, я попытался использовать readOnly=false и readOnlyMode=ignore . Эта последняя опция привела к уменьшению задержки, однако она все еще хуже, чем была раньше.

Есть ли у кого-нибудь еще опыт такой настройки? Какова оптимальная конфигурация? Мне не нужно помечать транзакцию как доступную только для чтения (кроме того, чтобы указать источнику данных маршрутизации использовать вместо этого реплику чтения), поэтому я хотел бы выяснить, можно ли сделать что-нибудь еще, чтобы задержка оставалась неизменной между узлами записи и чтения.

Примечание: На текущий момент узел считывания обслуживает только 1% всего трафика ( — 20req / s).

Комментарии:

1. Просто на всякий случай, поскольку вы упоминаете jOOQ: используете ли вы как эту @Transactional аннотацию, так и API транзакций jOOQ?

2. Я просто использую аннотацию @Transactional.