Symfony 4,Doctrine和AWS RDS读取副本使用情况

问题描述 投票:-2回答:1

我将开始使用具有主读/写和从属只读设置的RDS。

我已经阅读了Doctrine MasterSlaveConnection类型。

但是,我创建了一些端点,我想使用只读副本(大多数GET端点),而某些端点需要写数据(PUT,PATCH,DELETE端点)。

我也在使用API​​平台。

在Symfony 4和Doctrine 2中实现此目标的最佳方法是什么?

amazon-web-services symfony doctrine-orm amazon-rds symfony4
1个回答
-1
投票

我过去所做的只是使用不同的连接。

类似:

doctrine:
  dbal:
    default_connection: default
    connections:
      default:
        # This is your Master
        url: '%env(DATABASE_URL)%'
        driver: 'pdo_mysql'
        server_version: '5.7'
        charset: utf8mb4
      slave:
        # This would be the slave
        url: '%env(DATABASE_SLAVE_URL)%'
        driver: 'pdo_mysql'
        server_version: '5.7'
        charset: utf8mb4

  orm:
    default_entity_manager: default
    entity_managers:
      default:
        connection: default
        mappings:
          Main:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/src/Entity'
            prefix: 'App\Entity'
            alias: Main
      slave:
        connection: slave
        mappings:
          Main:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/src/Entity'
            prefix: 'App\Entity'
            alias: Main

https://symfony.com/doc/current/doctrine/multiple_entity_managers.html

然后,在您的控制器或业务逻辑中,您可以选择使用默认的实体管理器:

// Controller
$this->getDoctrine()->getEntityManager();

或者您可以获得从属连接:

// Controller
$this->getDoctrine()->getEntityManager('slave');

如果您只需要处理所有请求而不必为所有内容创建特殊操作,那么最好的办法就是装饰Collection和Item DataProviders来提供理论知识。

https://symfony.com/doc/current/service_container/service_decoration.html

https://github.com/api-platform/core/blob/master/src/Bridge/Doctrine/Orm/CollectionDataProvider.php

https://github.com/api-platform/core/blob/master/src/Bridge/Doctrine/Orm/ItemDataProvider.php

因此,基本上,您需要根据$opperationName来更改选择哪个经理:

if($opperationName === 'GET'){
    $manager = $this->managerRegistry->getManager('slave');
} else {
    $manager = $this->managerRegistry->getManager();
}
© www.soinside.com 2019 - 2024. All rights reserved.