问题可能是愚蠢的,而它并没有在现实世界中得到实践。无论如何,请给出你的想法/利弊..。
假设我有两个数据库读取副本数据库和主数据库
场景1:
Model.all
#它应该从读副本数据库中查询
场景2:
Model.create(attributes)
#它应该在主数据库中创建数据
场景3:
Model.where(condition: :some_condition).update(attributes)
#它应该从副本数据库读取数据并更新主数据库中的数据
注意:在运行时,数据库应该检测查询并处理上述3种场景。
问题:
这是一个有效的expectation?
发布于 2021-05-06 08:32:31
Rails 6为将传入请求自动路由到主数据库连接或读取副本提供了一个框架。
默认情况下,这个新功能允许您的应用程序自动将读取请求( GET,HEAD)路由到读-relica数据库,如果上次写请求(任何请求不是GET或HEAD请求)至少已经2秒了。
指定何时将读取请求路由到副本的逻辑是在解析器类(默认情况下为ActiveRecord::Middleware::DatabaseSelector::Resolver
)中指定的,如果需要自定义行为,将重写该类。
中间件还提供了一个会话类ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
,它负责跟踪上一次写请求是何时发出的。和解析器一样,这个类也可以被重写。
要启用默认行为,您可以将以下配置选项添加到应用程序的一个环境文件--例如config/environments/production.rb
:
config.active_record.database_selector = { delay: 2.seconds }
config.active_record.database_resolver =
ActiveRecord::Middleware::DatabaseSelector::Resolver
config.active_record.database_operations =
ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
如果您决定覆盖默认功能,可以使用这些配置选项来指定要使用的延迟、自定义解析器类的名称和自定义会话类的名称,这两个类都应该是默认类的后代。
https://stackoverflow.com/questions/67422113
复制相似问题