首页 > 解决方案 > 使用 @Transactional(readOnly=true) 时延迟增加

问题描述

我正在使用一个后端服务(Spring Boot 2.2.13.RELEASE + Hikari + JOOQ),它使用一个配置有写入器(主)节点和读取器(读取副本)节点的 AWS Aurora PostgreSQL 数据库集群。读取器节点刚刚闲置/温暖地等待升级为主节点以防故障转移。

最近,我们决定开始专门从阅读器节点为我们的一些 GET 端点提供查询服务。为了实现这一点,我们使用了 RoutingDataSource 的“风格”,以便每当使用 @Transactional(readOnly=true) 注释服务时,都会针对读取器数据源执行查询。

直到这里一切都很顺利。但是,在应用此解决方案后,我注意到与主数据源相比,延迟增加了 3 倍。 延迟从 DataDog 增加

在深入研究之后,我发现每个事务都在进行几次额外的往返数据库以设置会话特征:

设置会话特征 只读 实际查询/查询 设置会话特征 读写

从 Datadog 为每个事务设置会话特征

为了改善这一点,我尝试使用pg-jdbc pg-jdbc 42.2.10 中引入的readOnlyMode设置。此设置允许控制连接设置为只读 (readOnly=true) 时的行为。

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

在我的第一次尝试中,我使用了 readOnly=true 和 readOnlyMode=always。即使我弯腰看到 SET SESSION CHARACTERISTICS 语句,延迟保持不变。最后我尝试使用 readOnly=false 和 readOnlyMode=ignore。最后一个选项导致延迟减少,但它仍然比以前更糟。

其他人有这种设置的经验吗?什么是最优配置?我不需要将事务标记为只读(除了告诉路由数据源使用只读副本),所以我想弄清楚是否可以做任何其他事情,以便延迟之间保持不变Writer 和 Reader 节点。

注意:目前读取器节点仅服务于所有流量的 1%(+- 20req/s)。

标签: postgresqlspring-bootjooqhikaricppg-jdbc

解决方案


推荐阅读