当前位置: 首页 > 知识库问答 >
问题:

Spring Data JPA:如何在RDS Aurora PostgreSQL实例之间负载平衡读取查询?

赵英哲
2023-03-14

我在AWS中创建了一个Aurora PostgreSQL集群:

+ mydb (Role: Regional), (Engine: Aurora PostgreSQL), (Region and AZ: ap-southeast-2)
|
+- foo (Role: Writer),   (Engine: Aurora PostgreSQL), (Region and AZ: ap-southeast-2a), Multi-AZ (2 Zones)
|
+- bar (Role: Reader),   (Engine: Aurora PostgreSQL), (Region and AZ: ap-southeast-2b), Multi-AZ (2 Zones)

Writer实例有一个endpoint,Reader实例有一个endpoint:

| Endpoint name                                         | Type   |
|-------------------------------------------------------|--------|
| mydb.cluster-1234.ap-southeast-2.rds.amazonaws.com    | Writer |
| mydb.cluster-ro-1234.ap-southeast-2.rds.amazonaws.com | Reader |

在我的应用程序中,我像往常一样定义了一个数据源:

spring:
  datasource:
    url: jdbc:postgresql://mydb.cluster-1234.ap-southeast-2.rds.amazonaws.com:5432/someDb?currentSchema=someSchema
    username: someUser
    password: somePass

同样,代码中定义了一些普通实体和存储库:

public interface ThingRepository extends JpaRepository<Thing, Long> {
}

@Entity
public class Thing {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Basic
    private String name;

    // etc.
}

同样,也有一些普通的读/写操作:

public void doSomething() {
    Thing thing = thingRepository.findById(123L);
    // ...
}

public void doSomethingElse() {
    Thing thing = new Thing();
    thingRepository.save(thing);
    // ...
}

问题是所有这些查询都被发送到Aurora的Writer实例,而我的Reader实例仍然没有被使用。

但是我希望诸如findById,existsById,findAll等方法调用在我的集群中的所有实例之间进行负载平衡,并且仅将保存,保存全部删除ByIddeleteAll等操作发送到写入器实例。

有没有办法做到这一点?

共有2个答案

黄跃
2023-03-14

您是否尝试过将Spring Cloud AWSData Access与JDBC#一起使用?

它具有使用读取副本配置连接到Aurora实例所需的所有功能

林彬
2023-03-14

您可以做的是设置两个数据源并使用不同的数据源创建不同的存储库。

对于 JPA,这种方法存在一个问题:如果您读取一个实体并对其进行操作,它将被保存,这可能不起作用,并且至少在原始读取进入读取实例时是不希望的。

因此,为了防止这种情况,您必须做的是在加载实体后分离实体,如果您不确保在分离之前完全加载实体,这反过来将导致 LazyLoadException

 类似资料:
  • 是否有一种方法可以在微服务的两个pod之间进行主动和被动负载平衡。假设我有两个运行微服务的实例(pod),它是使用K8s服务对象公开的。是否有一种方法来配置负载平衡,使一个pod始终获得请求,当该pod停机时,另一个po将开始接收请求? 我在该服务的顶部还有一个ingress对象。

  • 刚刚浏览了这些文档: < Li > http://ActiveMQ . Apache . org/failover-transport-reference . html 那么,是否有可能配置消费者和生产者应用程序来连接和平衡多个代理实例之间的负载(以循环或类似的方式)?

  • Camel 是大众点评开发的软负载一体解决方案,承担了F5四层硬负载后的软负载工作。Camel已成为大众点评网络流量中必不可缺的一层。

  • 我有两条溪流。一个是事件流,另一个是数据库更新流。我想用从DB更新流构建的信息丰富事件流。 事件流非常庞大,使用5个字段进行分区。这给了我很好的分配。DB流不那么喋喋不休,并且使用两个字段进行分区。我目前正在使用两个公共字段连接这两个流,并使用flapMap来丰富第一个流。flatMap运算符使用ValueState维护状态,状态由两个公共字段自动键入。 除了实现自定义逻辑来手动提取键并更新维护状

  • 这是我的第一个负载平衡问题。 我已经编写了一个简单的express应用程序来了解负载平衡是如何工作的。我还看了一些类似于的东西。如果我必须使用Nginx进行负载平衡,那么我是否应该在4个不同的docker容器中运行4个不同的express实例,然后使用Nginx在它们之间进行负载平衡,而Nginx位于自己的容器中? 我说得对吗?我有点困惑

  • AWS推出了应用程序负载平衡器,可以进行基于路径的路由。是否可以将经典负载平衡器放在应用程序负载平衡器之后。 示例:假设我们有两个经典的负载平衡器。应用程序负载平衡器将流量路由到所有url(如应用程序负载平衡器/前端)的第一个经典负载平衡器,并将流量路由到所有url(如应用程序负载平衡器/后端)的第二个经典负载平衡器* 目前,似乎我们只能将主机置于应用程序负载平衡器之后。是否可以将负载平衡器置于应